我正在尝试使用一些动态 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
这是我第一次使用立即执行,所以我想知道是否有什么我不完全理解的地方,非常感谢任何帮助。
您不能对 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
但是动态创建对象通常不是一个好主意,也不是必需的。目前尚不清楚您将其用于什么目的,因此可能会有更好的选择。如果你打算沿着这条路线走下去,那么你将需要在某个时候删除表格,并且可能在每次尝试重新创建它之前进行保护性删除。如果多个用户连接到同一个模式,那么你仍然会有问题。