创建过程,其中 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>