我正在嘗試在 Oracle PL/SQL 中創建一個程序,我將表所有者的名稱、表名稱和列名稱傳遞給該程序,以便我可以將其列印到螢屏上。
該程式的基礎是:
CREATE PROCEDURE table_printer(owner VARCHAR, table_name VARCHAR, column_name VARCHAR)
IS
...
我的基本想法是將它傳遞給程式內的 CURSOR,但我了解到您不能真正做到這一點,而且我似乎無法找到它的動態方式。
我的最佳結果是遍歷給定引數的游標并列印出每一行。
謝謝您的幫助!
uj5u.com熱心網友回復:
我會想到一個回傳例如 ref cursor 的函式,它實際上可以在其他地方使用。使用dbms_output.put_line,您只能使用支持它的工具(例如 SQL*Plus 或 SQL Developer);在其他工具(例如 Oracle Apex 或 Forms)中,您將看不到任何內容。
這是一個示例:它是動態 SQL。dbms_assert用于防止SQL注入。
SQL> create or replace function f_test
2 (par_owner in varchar2, par_table_name in varchar2, par_column_name in varchar2)
3 return sys_refcursor
4 is
5 l_str varchar2(200);
6 rc sys_refcursor;
7 begin
8 l_str := 'select ' || dbms_assert.simple_sql_name (par_column_name) ||
9 ' from ' || dbms_assert.schema_name (par_owner) ||'.'||
10 dbms_assert.sql_object_name (par_table_name);
11 open rc for l_str;
12 return rc;
13 end;
14 /
Function created.
SQL> select f_test('SCOTT', 'DEPT', 'DNAME') result from dual;
RESULT
--------------------
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
DNAME
--------------
ACCOUNTING
RESEARCH
SALES
OPERATIONS
SQL>
[編輯:如果必須的話dbms_output.put_line,那么...]
SQL> set serveroutput on
SQL>
SQL> create or replace procedure p_test
2 (par_owner in varchar2, par_table_name in varchar2, par_column_name in varchar2)
3 is
4 l_str varchar2(200);
5 rc sys_refcursor;
6 --
7 l_dname dept.dname%type;
8 begin
9 l_str := 'select ' || dbms_assert.simple_sql_name (par_column_name) ||
10 ' from ' || dbms_assert.schema_name (par_owner) ||'.'||
11 dbms_assert.sql_object_name (par_table_name);
12 open rc for l_str;
13 loop
14 fetch rc into l_dname;
15 exit when rc%notfound;
16 dbms_output.put_line(l_dname);
17 end loop;
18 end;
19 /
Procedure created.
SQL> exec p_test('SCOTT', 'DEPT', 'DNAME');
ACCOUNTING
RESEARCH
SALES
OPERATIONS
PL/SQL procedure successfully completed.
SQL>
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/368558.html
上一篇:帶條件的資料透視表
