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

Làm cách nào để tạo một hàm trả về (các) tên cột của ràng buộc?

Bạn có thể sử dụng SYS_REFCURSOR thay vì các kiểu dữ liệu nội bộ tiêu chuẩn như VARCHAR2 như trong trường hợp của bạn để có thể trả về nhiều hàng. Câu lệnh SELECT với mệnh đề INTO không thể trả về nhiều hàng và thông báo lỗi hiện tại (ORA-01422 ) ném đá.

Do đó, hãy tạo một hàm được lưu trữ có chứa SYS_REFCURSOR đầu tiên:

SQL> CREATE OR REPLACE FUNCTION GET_CONSTRAINT_COLUMNS(iTableName      IN VARCHAR2,
                                                       iConstraintName IN VARCHAR2)
                         RETURN SYS_REFCURSOR AS
  wkeys SYS_REFCURSOR;
  v_sql VARCHAR2(32767);
BEGIN

  v_sql := 'SELECT column_name
              FROM user_cons_columns
             WHERE constraint_name = :ic
               AND table_name = :it';

  OPEN wkeys FOR v_sql USING iconstraintname, iTableName;
  RETURN wkeys;
END;
/

và sau đó gọi từ bảng điều khiển của Nhà phát triển SQL là

SQL> DECLARE
    wConsumable SYS_REFCURSOR;
BEGIN
   :wConsumable := GET_CONSTRAINT_COLUMNS('PRODUCTS',  'PRODUCTSPK');
END;
/

SQL> PRINT wConsumable ;
  • SQL đầu tiên (được chuẩn bị cho CURSOR Extract_KEY ) là thừa;
  • Không có sự khác biệt giữa hai SELECT các câu lệnh trong LOOP , btw LOOP không cần thiết khi sử dụng trường hợp hiện tại này;
  • Lệnh PRINT có thể được sử dụng thay cho DBMS_OUTPUT.PUT_LINE inorder để trả về kết quả của một SYS_REFCURSOR .


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tồn tại trong con trỏ nơi đáp ứng điều kiện

  2. Thay đổi thông báo hiển thị oracle

  3. cách sử dụng dbms_scheduler để chạy công việc sau mỗi 30 phút

  4. Làm việc với ngày tháng trong Oracle SQL

  5. Tên đường dẫn đầy đủ của cài đặt JDK cho Oracle SQL Developer