带有GRANT的Oracle WITH AS SELECT

时间:2019-07-18 00:58:29

标签: oracle with-statement grant

我正在使用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:

2 个答案:

答案 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的观点,但您可能希望研究其他方法。我觉得有一种更简单的方法来完成您要寻找的东西。