Tôi có một giải pháp tuyệt vời cho bạn, nhưng có hai điều bạn cần làm:
-
Đặt SQL bên trong một đơn vị chương trình PL / SQL. Vì vậy, có, đối với thủ tục được lưu trữ mà bạn đã đề cập.
-
Biên dịch đơn vị chương trình đó và tất cả các bảng phụ thuộc (nghĩa là cài đặt mã ứng dụng của bạn) trên phiên bản 12.2 (bạn có thể tải xuống 12.2 tại http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html hoặc bạn có thể mua Dịch vụ Exadata Express CLoud tại cloud.oracle.com hoặc nhận tín dụng 300 đô la để sử dụng miễn phí một tháng tại cloud.oracle.com/tryit).
12.2 là chìa khóa vì tính năng bạn THỰC SỰ muốn sử dụng được gọi là PL / Scope và nó là một công cụ biên dịch thu thập thông tin về số nhận dạng PL / SQL (kể từ 11.1) và cách sử dụng SQL bên trong PL / 'SQL (kể từ 12.2).
CREATE TABLE my_data (n NUMBER)
/
ALTER SESSION SET plscope_settings='identifiers:all, statements:all'
/
CREATE OR REPLACE PROCEDURE my_procedure (n_in IN NUMBER)
AUTHID DEFINER
IS
l_n my_data.n%TYPE;
CURSOR all_data_cur
IS
SELECT *
FROM my_data
FOR UPDATE OF n;
BEGIN
INSERT INTO my_data (n)
VALUES (n_in);
END;
/
SELECT idt.line,
idt.owner || '.' || idt.object_name code_unit,
idt.name column_name,
RTRIM (src.text, CHR (10)) text
FROM all_identifiers idt, all_source src
WHERE idt.usage = 'REFERENCE'
AND idt.TYPE = 'COLUMN'
AND idt.line = src.line
AND idt.object_name = src.name
AND idt.owner = src.owner
AND idt.object_name = 'MY_PROCEDURE'
ORDER BY code_unit, line
/
LINE CODE_UNIT COLUMN_NAME TEXT
4 STEVEN.MY_PROCEDURE N l_n my_data.n%TYPE;
10 STEVEN.MY_PROCEDURE N FOR UPDATE OF n;
12 STEVEN.MY_PROCEDURE N INSERT INTO my_data (n)
Hy vọng điều đó sẽ hữu ích!
Rất nhiều ví dụ khác về PL / Phạm vi tại livesql.oracle.com. Chỉ cần tìm kiếm "pl / scope" (duh).