从SELECT执行包时使用ORA-00904



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

ORA-00904:"EVIL_PKG"。"CREATETB":无效标识符00904.00000-"%s:无效标识符"*原因:
*操作:第41行第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调用。

如果您将过程转换为函数(可能返回true或false或返回值),则可以从sql中调用该函数。

你也可以在这里看到讨论,以加深你的理解。

最新更新