使用立即执行创建全局临时表

问题描述 投票:0回答:1

我正在尝试使用一些动态 SQL 在 oracle apex 中创建一个临时表,这很困难。目标是能够从复选框组中选择一些项目并创建一个临时表,其中选中的项目是列名。这是我到目前为止的代码:

DECLARE
  c_query VARCHAR2(4000);
  l_cols VARCHAR2(4000) := NVL(:P31_PARTS,'EMPNO');
  l_rows VARCHAR2(4000) := NVL(:P31_CRITERIA,1);
  l_cols_arr  apex_t_varchar2;
  cols_arr_size integer;
  l_rows_arr  apex_t_varchar2; 
  rows_arr_size integer;
  
BEGIN
    l_cols_arr := apex_string.split(p_str => l_cols, p_sep => ':');
    l_rows_arr := apex_string.split(p_str => l_rows, p_sep => ':');
    cols_arr_size := l_cols_arr.count;
    rows_arr_size := l_rows_arr.count;

    FOR i in 1..cols_arr_size
    LOOP
        l_cols_arr(i) := REPLACE(l_cols_arr(i), ' ', '_');
    END LOOP;

    c_query := 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE table_view (Criteria_Name varchar2(4000) NULL, ';
    FOR i in 1..(cols_arr_size - 1)
    LOOP
        c_query := c_query||l_cols_arr(i)||' varchar2(4000) NULL, ';
    END LOOP;
    c_query := c_query||l_cols_arr(cols_arr_size)||' varchar2(4000) NULL) ON COMMIT DELETE ROWS';
    :P31_QUERY := c_query; 
    EXECUTE IMMEDIATE c_query;
END;

运行此代码会出现以下错误:ORA-00922:执行 PL/SQL 代码的选项缺失或无效。我试图注释掉立即执行语句并将查询放在页面项中,它看起来像这样:

CREATE OR REPLACE GLOBAL TEMPORARY TABLE table_view (Criteria_Name varchar2(4000) NULL, CDC_Part_1 varchar2(4000) NULL, CDC_Part_2 varchar2(4000) NULL) ON COMMIT DELETE ROWS

这是我第一次使用立即执行,所以我想知道是否有什么我不完全理解的地方,非常感谢任何帮助。

plsql oracle-apex
1个回答
1
投票

您不能对 Oracle 中的表执行

CREATE OR REPLACE
;请参阅文档中的语法图

没有

OR REPLACE
它有效:

CREATE GLOBAL TEMPORARY TABLE table_view (Criteria_Name varchar2(4000) NULL, CDC_Part_1 varchar2(4000) NULL, CDC_Part_2 varchar2(4000) NULL) ON COMMIT DELETE ROWS

小提琴

但是动态创建对象通常不是一个好主意,也不是必需的。目前尚不清楚您将其用于什么目的,因此可能会有更好的选择。如果你打算沿着这条路线走下去,那么你将需要在某个时候删除表格,并且可能在每次尝试重新创建它之前进行保护性删除。如果多个用户连接到同一个模式,那么你仍然会有问题。

© www.soinside.com 2019 - 2024. All rights reserved.