Oracle 如何在side proceudre中创建视图

Oracle 如何在side proceudre中创建视图,oracle,plsql,Oracle,Plsql,在过程内部创建视图时出错,请使用以下代码。但是我需要动态地创建这个视图。 当我尝试使用现有视图运行相同的脚本时,它工作正常,但我需要在光标初始化之前动态创建视图 CREATE OR REPLACE PROCEDURE proc_dashboard_tiles (out_dashboard_tab OUT return_dashboard_arr, start_date IN DATE,

在过程内部创建视图时出错,请使用以下代码。但是我需要动态地创建这个视图。 当我尝试使用现有视图运行相同的脚本时,它工作正常,但我需要在光标初始化之前动态创建视图

CREATE OR REPLACE PROCEDURE proc_dashboard_tiles (out_dashboard_tab OUT return_dashboard_arr,
                                                   start_date IN DATE,
                                                   end_date IN DATE
) IS


    lrec                   return_dashboard_report;
    l_num_counter          NUMBER := 0;
--     CREATE OR REPLACE VIEW x AS (
--     EXECUTE IMMEDIATE
--    'SELECT
--        COUNT(*) count,
--        CONCAT('Tier ',customer_tier) value,
--         'customer_tier' viewType
--    FROM
--        bi_request
--    WHERE
--        customer_tier is not null
--        AND START_DATE BETWEEN start_date and end_date
--    GROUP BY
--        customer_tier'
--        );
    CURSOR cur_dashboard_data IS
    SELECT
        count,
        value,
        viewType
    FROM
        v_customer_tier
        ;

    TYPE rec_dashboard_data IS
        TABLE OF cur_dashboard_data%rowtype INDEX BY PLS_INTEGER;
    l_cur_dashboard_data   rec_dashboard_data;
BEGIN
--    My code EXCEPTION
                        dbms_output.put_line('My code');

END;````

while creating a view inside the procedure through error.
when I try to run the same script with existing view it's working fine but I need to create view dynamically before the cursor initialization

您的代码应该如下所示:

Declare
rec_dashboard_data sys_refcursor;
-- other variable declaration
Begin
Execute immediate q'#<your create view sql>#';
Open rec_dashboard_data for 'SELECT
        count,
        value,
        viewType
    FROM
        v_customer_tier';
-- other task
--Exception block
End;
/

干杯

如果没有execute immediate,您无法在过程中执行ddl,而且它应该在begin块中,而不是DECLAREY中。您需要在execute immediate中具有create或replace视图。但是,如果在创建过程时该视图不存在,那么对该视图的每个后续引用都需要通过动态SQL进行—您不能在游标定义或后续变量声明中使用静态SQL。这是可能的,但要复杂得多。首先,为什么要尝试动态创建视图?也许你想定义一个流水线表函数和/或一个返回REF游标的函数,你可以将日期传递给它?我同意Justin的观点。你应该告诉我们你为什么要这么做。除非绝对需要,否则最好避免使用动态sql。