Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Gọi một lệnh gọi hàm trong một chuỗi trong một Thủ tục Oracle

Thật dễ dàng để thực thi động một chuỗi ...

create or replace function fmt_fname (p_dyn_string in varchar2)
    return varchar2
is
    return_value varchar2(128);
begin
    execute immediate 'select '||p_dyn_string||' from dual'
        into return_value;
    return  return_value;
end fmt_fname;
/

Vấn đề nảy sinh khi chuỗi của bạn chứa các ký tự, với các dấu ngoặc kép đáng sợ ...

SQL> select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
  2  /
select fmt_fname('TEST||to_char(sysdate, 'DDD')') from dual
                                          *
ERROR at line 1:
ORA-00907: missing right parenthesis


SQL>

Vì vậy, chúng ta phải thoát khỏi các dấu nháy đơn, tất cả chúng, bao gồm cả những dấu nháy đơn mà bạn chưa đưa vào chuỗi đã đăng của mình:

SQL> select * from t34
  2  /

        ID FILENAME
---------- ------------------------------
         1 APC001
         2 XYZ213
         3 TEST147


SQL> select * from t34
  2  where filename = fmt_fname('''TEST''||to_char(sysdate, ''DDD'')')
  3  /

        ID FILENAME
---------- ------------------------------
         3 TEST147

SQL>

CHỈNH SỬA

Vì lẽ công bằng, tôi cảm thấy tôi nên chỉ ra rằng giải pháp của Tony cũng hoạt động tốt:

SQL> create or replace function fmt_fname (p_dyn_string in varchar2)
  2      return varchar2
  3  is
  4      return_value varchar2(128);
  5  begin
  6      execute immediate 'begin :result := ' || p_dyn_string || '; end;'
  7          using out return_value;
  8      return  return_value;
  9  end;
 10  /

Function created.

SQL> select fmt_fname('''TEST''||to_char(sysdate, ''DDD'')') from dual
  2  /

FMT_FNAME('''TEST''||TO_CHAR(SYSDATE,''DDD'')')
--------------------------------------------------------------------------------
TEST147

SQL>

Trên thực tế, bằng cách tránh SELECT trên DUAL, có lẽ tốt hơn.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách giải quyết ORA-06512 tại số dòng

  2. Tôi không hiểu đối chiếu? (Mysql, RDBMS, Bộ ký tự)

  3. Oracle không thể cập nhật lên NULL

  4. Trình kích hoạt chèn có cần câu lệnh cam kết không

  5. Cách Hiển thị Tất cả Đặc quyền Cơ sở dữ liệu Oracle cho Người dùng