Oracle 正在寻找一种数据类型,该数据类型可以通过批量收集填充到中,然后通过选择从中进行选择

Oracle 正在寻找一种数据类型,该数据类型可以通过批量收集填充到中,然后通过选择从中进行选择,oracle,plsql,nested-table,table-functions,Oracle,Plsql,Nested Table,Table Functions,我目前使用的PL-SQL包有一个很大的问题 我所要做的就是创建一小段代码来实现这一点: 在函数的部分中: l_tabellen_excl DBMS_utility.name_array; 代码后面部分: SELECT DISTINCT TABLE_NAME BULK COLLECT INTO l_tabellen_excl FROM ALL_TAB_COLUMNS WHERE TABLE_NAME IN ('TAB_1', 'TAB_2'); 要在语句中最终使用此变量,请选择语句: AND

我目前使用的PL-SQL包有一个很大的问题

我所要做的就是创建一小段代码来实现这一点:

在函数的
部分中:

l_tabellen_excl DBMS_utility.name_array;
代码后面部分:

SELECT DISTINCT TABLE_NAME
BULK COLLECT INTO l_tabellen_excl
FROM
ALL_TAB_COLUMNS
WHERE
TABLE_NAME IN ('TAB_1', 'TAB_2');
要在
语句中最终使用此变量,请选择
语句:

AND col.table_name NOT IN (SELECT * FROM TABLE (l_tabellen_excl))
我在这里得到了ORA-22905:无法从非嵌套表项访问行

我知道我可以只写
和col.table\u name不在('TAB\u 1','TAB\u 2')
中,但我不想在代码的最深处硬编码它。。。使其难以找到且不易配置

我尝试了很多东西:

type array_t is table of varchar2(10);
不起作用。我得到一个错误,说明我不能在SELECT语句中使用本地声明的集合

我试图将变量
I_tabellen_excl
强制转换为本地声明的类型,就像一种解决方法。但是我得到了ORA-00902——无效的数据类型

我试图声明一个VARCHAR2,它包含一个用逗号分隔的表列表的字符串,它似乎可以工作,但它离一个干净、编写良好、设计良好的代码还很远

我尝试了其他不值得一提的选项,比如尝试编写函数等等


我在这件事上迷失了方向,任何想法都可以测试。

如果你想使用函数,那么你必须创建类型作为一个对象类型,它将存储在数据库中,并使用它创建一个函数。稍后,您可以在PL/SQL代码中使用table函数

否则,按照使用嵌套表的方式,必须再次循环以引用集合对象

SET serveroutput ON
DECLARE
type str_typ
IS
  TABLE OF VARCHAR2(200);
  str_sub str_typ := str_typ ();
BEGIN
  SELECT DISTINCT TABLE_NAME BULK COLLECT INTO str_sub FROM ALL_TAB_COLUMNS;
  FOR i IN 1..str_sub.count
  LOOP
    dbms_output.put_line(str_sub(i));
  END LOOP;
END;
/
因此,不能将其用作数据库对象,因此必须将该类型创建为对象类型,并创建表函数

比如说,

创建类型

SQL> CREATE TYPE col_type AS OBJECT (
  2    col_name VARCHAR2(50)
  3  );
  4  /

Type created.

SQL> CREATE TYPE col_sub_type IS TABLE OF col_type;
  2  /

Type created.
构建表格功能

SQL> CREATE OR REPLACE FUNCTION get_col_tab RETURN col_sub_type AS
  2    l_type  col_sub_type := col_sub_type();
  3  BEGIN
  4    FOR i IN (SELECT DISTINCT TABLE_NAME t_name FROM ALL_TAB_COLUMNS) LOOP
  5      l_type.extend;
  6      l_type(l_type.last) := col_type(i.t_name);
  7    END LOOP;
  8
  9    RETURN l_type;
 10  END;
 11  /

Function created.
测试它

SELECT *
FROM   TABLE(get_col_tab());

我已经把它放在了Oracle软件包中,但是仍然有很多编译错误。还有-我可以在循环中访问这个stru_sub吗?我只需要声明一个包含所选表名的变量,并在select语句中使用它们,将它们从输出中排除:(我看到了编辑过的版本。现在可能更有用了!谢谢!@dziki的第一种方法,使用嵌套表,你需要形成一个动态sql并使用EXECUTE IMMEDIATE。因为你必须循环表名并动态使用它。还有一个问题。我应该把它放在包体中的什么位置?无论我尝试什么-都不起作用。你是谁尝试?使用嵌套表或表函数的第一种方法?对于第一种方法,您只需要在包体中执行。只需声明嵌套表并初始化它。您可以看到工作示例。简单的PL/SQL。对于第二种方法,使用表函数。您需要在一次之外执行。类型和函数将是创建为数据库对象并将存储在数据库中。您不必在包中创建任何类型/集合,只需像其他静态表一样直接引用表函数即可。