创建过程,其中 table 所有者、名称和行作为参数传递
Create procedure where table owner, name and row is passed as parameter
我正在尝试在 Oracle PL/SQL 中创建一个过程,我将 table 所有者的名称、table 名称和列名称传递给该过程,以便我可以打印到屏幕上。
程序的基础是:
CREATE PROCEDURE table_printer(owner VARCHAR, table_name VARCHAR, column_name VARCHAR)
IS
...
我的基本想法是将它传递给过程中的 CURSOR,但我了解到你不能真正做到这一点,而且我似乎找不到它的动态方式。
我的最佳结果是遍历给定参数的游标并打印出每一行。
感谢您的帮助!
我会想到一个函数 returns 例如实际上可以在其他地方使用的 ref 游标。对于 dbms_output.put_line
,您只能将其与支持它的工具一起使用(例如 SQL*Plus 或 SQL Developer);在其他工具(例如 Oracle Apex 或 Forms)中,您不会看到 anything.
这是一个例子:动态 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>
我正在尝试在 Oracle PL/SQL 中创建一个过程,我将 table 所有者的名称、table 名称和列名称传递给该过程,以便我可以打印到屏幕上。
程序的基础是:
CREATE PROCEDURE table_printer(owner VARCHAR, table_name VARCHAR, column_name VARCHAR)
IS
...
我的基本想法是将它传递给过程中的 CURSOR,但我了解到你不能真正做到这一点,而且我似乎找不到它的动态方式。
我的最佳结果是遍历给定参数的游标并打印出每一行。
感谢您的帮助!
我会想到一个函数 returns 例如实际上可以在其他地方使用的 ref 游标。对于 dbms_output.put_line
,您只能将其与支持它的工具一起使用(例如 SQL*Plus 或 SQL Developer);在其他工具(例如 Oracle Apex 或 Forms)中,您不会看到 anything.
这是一个例子:动态 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>