从 SELECT 执行包时出现 ORA-00904

ORA-00904 when executing package from SELECT

正在尝试设置特定的安全测试用例。这个想法是创建一个可以使用 select 语句从 PL/SQL 调用的包。该包工作并创建 table 但是当我在 Oracle SQL Developer 中 运行 SELECT evil_pkg.CreateTab() FROM DUAL 我得到

ORA-00904: "EVIL_PKG"."CREATETAB": invalid identifier 00904. 00000 - "%s: invalid identifier" *Cause:
*Action: Error at Line: 41 Column: 8

有什么办法可以做到吗? 这里的目的是以这种特定的方式执行包,而不仅仅是为了 执行包。

这是包裹:

--Specification
CREATE OR REPLACE PACKAGE evil_pkg AS
  PROCEDURE CreateTab;
END evil_pkg;
/

--Body 
CREATE OR REPLACE PACKAGE BODY evil_pkg AS

  PROCEDURE CreateTab
AS 

BEGIN 

 execute immediate 'CREATE TABLE my_evil_table (id number) ';

      COMMIT ; 

EXCEPTION 
        WHEN OTHERS THEN 
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
        DBMS_OUTPUT.PUT_LINE(DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
        ROLLBACK;
        RAISE;

        END CreateTab;

END evil_pkg;

无法从 SQL 调用程序包内的过程。

如果您将过程转换为函数(returns 可能是 true 或 false 或 returns 一个值),那么可以从 sql 调用它。

您也可以在此处查看 discussion 以加深您的理解。