如何在嵌套 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;