我正在使用WITH创建类似临时表的内容并对其进行查询。但是我的SELECT(在临时表上运行)有一个函数调用,其中临时表作为输入参数。 如何授予函数对使用WITH创建的临时表的访问权限。
WITH TEMP_TABLE AS
(select * from schema1.main_table where col_datetime > sysdate - 4) -- to reduce the data main query executes upon
(
Select * FROM table(schema2.FUNCTION1(blah, blah, 'TEMP_TABLE', blah, blah))
);
下面的错误
ORA-00942: table or view does not exist
ORA-06512: at "schema2.FUNCTION1", line 143
ORA-06512: at line 1
00942. 00000 - "table or view does not exist"
*Cause:
*Action:
答案 0 :(得分:1)
您正在使用公用表表达式(CTE)。仅在更广泛的查询的上下文中临时创建CTE,因此CTE的完整记录数据集超出了功能的可用范围。您可以使用CTE中的各个值并传递给函数,但您的函数看不到完整的CTE。 CTE在该功能可访问的上下文中不存在。
您可以考虑发布一个单独的问题,描述您希望在函数内部完成的工作,我们也许可以为您提供一些适合SQL规范的替代方法的指针。
答案 1 :(得分:1)
PL / SQL WITH
函数可以直接回答您的问题。您无法传递WITH
表,但是可以使用WITH
函数创建表,然后在现有函数中引用该表。
此代码需要Oracle 12.1。并且请注意使用这些名称进行SQL注入的可能性。
with
function create_temp_table return varchar2 is
pragma autonomous_transaction;
begin
execute immediate 'drop table temp_table';
execute immediate 'create table temp_table as select 2 a, 3 b from dual';
return 'temp_table';
end;
select * from table(function1(create_temp_table()))
/
以下是使上述SQL工作的示例架构:
create or replace type function1_rec is object(a number, b number);
create or replace type function1_nt is table of function1_rec;
create or replace function function1(p_table_name varchar2) return function1_nt is
v_results function1_nt;
begin
execute immediate 'select function1_rec(a,b) from '||p_table_name
bulk collect into v_results;
return v_results;
end;
/
尽管我同意Sam M的观点,但您可能希望研究其他方法。我觉得有一种更简单的方法来完成您要寻找的东西。