如何在嵌套 pl/sql 块中立即创建表
How to get tables to be created immediately in nested pl/sql block
我正在创建表,然后对这些表进行计数并将它们存储在变量中,所有这些都在 Oracle 数据库的嵌套 pl/sql 块中。我收到错误 "ORA-00942: table or view does not exist"。如果我先创建表,然后 运行 我的块,它执行时没有错误。
因此,我知道没有创建表,即使我使用的是 EXECUTE IMMEDIATE
命令。 (我认为这个命令会绕过 PL/SQL 块中使用的所有对象必须在执行 PL/SQL 块之前存在的事实。)
此时在我的街区外创建表格会很困难,还有其他方法吗?
示例代码如下:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
SELECT count(1) INTO v_Count_Task1A
FROM T_Task1A_Roles_w_User_IDs;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;
问题不是你的 table 没有在块 运行 时创建,问题是 table 在 [=] 时不存在15=] 已编译,因此无法编译,因此根本不可能是 运行。
这里的解决方案是使用更动态的 SQL 来执行计数,因为动态 SQL 在块执行之前不会被解析:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
EXECUTE IMMEDATE 'SELECT count(1) FROM T_Task1A_Roles_w_User_IDs'
INTO v_Count_Task1A;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;
您需要 SELECT INTO
动态 sql:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
EXECUTE IMMEDIATE '
SELECT count(1)
FROM T_Task1A_Roles_w_User_IDs'
INTO v_Count_Task1A;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;
我正在创建表,然后对这些表进行计数并将它们存储在变量中,所有这些都在 Oracle 数据库的嵌套 pl/sql 块中。我收到错误 "ORA-00942: table or view does not exist"。如果我先创建表,然后 运行 我的块,它执行时没有错误。
因此,我知道没有创建表,即使我使用的是 EXECUTE IMMEDIATE
命令。 (我认为这个命令会绕过 PL/SQL 块中使用的所有对象必须在执行 PL/SQL 块之前存在的事实。)
此时在我的街区外创建表格会很困难,还有其他方法吗?
示例代码如下:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
SELECT count(1) INTO v_Count_Task1A
FROM T_Task1A_Roles_w_User_IDs;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;
问题不是你的 table 没有在块 运行 时创建,问题是 table 在 [=] 时不存在15=] 已编译,因此无法编译,因此根本不可能是 运行。
这里的解决方案是使用更动态的 SQL 来执行计数,因为动态 SQL 在块执行之前不会被解析:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
EXECUTE IMMEDATE 'SELECT count(1) FROM T_Task1A_Roles_w_User_IDs'
INTO v_Count_Task1A;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;
您需要 SELECT INTO
动态 sql:
DECLARE
g_user varchar2(30) := 'schema';
BEGIN
/* more code and nested blocks*/
DECLARE
v_Count_Task1A number(6);
BEGIN
EXECUTE IMMEDIATE 'CREATE TABLE ' ||g_user||'.T_Task1A_Roles_w_User_IDs AS
SELECT ROWNUM AS Dummy_Field, USUS_ID AS Task1A_Role, User_ID AS Task1A_User_ID
FROM Task1A_Roles_w_User_IDs';
EXECUTE IMMEDIATE '
SELECT count(1)
FROM T_Task1A_Roles_w_User_IDs'
INTO v_Count_Task1A;
/*more operations like this*/
END;
/* more code and nested blocks*/
END;