从 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 以加深您的理解。
正在尝试设置特定的安全测试用例。这个想法是创建一个可以使用 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 以加深您的理解。