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

Tham số ràng buộc với SQL động Oracle

Bạn có thể sử dụng gói DBMS_SQL. Điều này cung cấp một cách thay thế để chạy SQL động. Nó có thể cồng kềnh hơn một chút để sử dụng, nhưng nó có thể linh hoạt hơn, đặc biệt là với nhiều tham số ràng buộc khác nhau.

Đây là cách bạn có thể sử dụng nó (cảnh báo:Tôi chưa thử nghiệm cái này):

FUNCTION player_search (
   pName        IN VARCHAR2,
   pHeight      IN NUMBER,
   pTeam        IN VARCHAR2
) RETURN SYS_REFCURSOR
IS 
  cursor_name   INTEGER;
  ignore        INTEGER;
  id_var        MyTable.ID%TYPE;
  name_var      MyTable.Name%TYPE;
  height_var    MyTable.Height%TYPE;
  team_var      MyTable.Team%TYPE;
BEGIN
  -- Put together SQLQuery here...

  -- Open the cursor and parse the query         
  cursor_name := DBMS_SQL.OPEN_CURSOR; 
  DBMS_SQL.PARSE(cursor_name, SQLQuery, DBMS_SQL.NATIVE); 

  -- Define the columns that the query returns.
  -- (The last number for columns 2 and 4 is the size of the
  -- VARCHAR2 columns.  Feel free to change them.)
  DBMS_SQL.DEFINE_COLUMN(cursor_name, 1, id_var); 
  DBMS_SQL.DEFINE_COLUMN(cursor_name, 2, name_var, 30); 
  DBMS_SQL.DEFINE_COLUMN(cursor_name, 3, height_var); 
  DBMS_SQL.DEFINE_COLUMN(cursor_name, 4, team_var, 30); 

  -- Add bind variables depending on whether they were added to
  -- the query.
  IF pName IS NOT NULL THEN
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':pName', pName);
  END IF;

  IF pHeight > 0 THEN
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':pHeight', pHeight);
  END IF;

  IF pTeam IS NOT NULL THEN
    DBMS_SQL.BIND_VARIABLE(cursor_name, ':pTeam', pTeam);
  END IF;

  -- Run the query.
  -- (The return value of DBMS_SQL.EXECUTE for SELECT queries is undefined,
  -- so we must ignore it.)
  ignore := DBMS_SQL.EXECUTE(cursor_name); 

  -- Convert the DBMS_SQL cursor into a PL/SQL REF CURSOR.
  RETURN DBMS_SQL.TO_REFCURSOR(cursor_name);

EXCEPTION 
  WHEN OTHERS THEN 
    -- Ensure that the cursor is closed.
    IF DBMS_SQL.IS_OPEN(cursor_name) THEN 
      DBMS_SQL.CLOSE_CURSOR(cursor_name); 
    END IF; 
    RAISE; 
END; 

(Lưu ý:DBMS_SQL.TO_REFCURSOR mới trong Oracle 11g.)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sửa lỗi “ORA-01789:khối truy vấn có số cột kết quả không chính xác”

  2. Kết nối bị treo sau thời gian không hoạt động

  3. Có cách nào, trong ORACLE, để nối nhiều dòng hàng thành một dòng duy nhất, sử dụng hai bảng, trong đó các giá trị cuối cùng được phân tách bằng dấu phẩy không?

  4. Làm ơn để đánh vần số (đơn vị tiền tệ) sang đơn vị tiền tệ của Ý mà không cần mã cứng số bản dịch

  5. Sử dụng hàm Max () để chọn giá trị nhóm