【发布时间】:2014-06-24 23:10:45
【问题描述】:
我执行了一个创建下表的 PL/SQL 脚本
TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';
我使用参数为这个表创建了一个插入函数
CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
p_page_id IN B2BOWNER.SSC_Page_Map.Page_ID_NBR%TYPE,
p_page_type IN B2BOWNER.SSC_Page_Map.Page_Type%TYPE,
p_page_dcpn IN B2BOWNER.SSC_Page_Map.Page_Dcpn%TYPE)
我被告知我必须在 B2BOWNER.SSC_Page_Map 出现之前声明它作为我的函数的参数。为什么会出现此错误?
编辑:实际错误
Warning: compiled but with compilation errors
Errors for FUNCTION F_SSC_PAGE_MAP_INSERT
LINE/COL ERROR
-------- -----------------------------------------------------------------
2/48 PLS-00201: identifier 'SSC_PAGE_MAP.PAGE_ID_NBR' must be declared
0/0 PL/SQL: Compilation unit analysis terminated
编辑:完整的 PL/SQL 函数
RETURN INTEGER
IS
TABLE_DOES_NOT_EXIST exception;
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942
BEGIN
INSERT INTO
B2BOWNER.SSC_Page_Map VALUES(
p_page_id,
p_page_type,
p_page_dcpn);
RETURN 0;
EXCEPTION
WHEN TABLE_DOES_NOT_EXIST THEN
RETURN -1;
WHEN DUP_VAL_ON_INDEX THEN
RETURN -2;
WHEN INVALID_NUMBER THEN
RETURN -3;
WHEN OTHERS THEN
RETURN -4;
END;
SHOW ERRORS PROCEDURE F_SSC_Page_Map_Insert;
GRANT EXECUTE ON F_SSC_Page_Map_Insert TO B2B_USER_DBROLE;
RETURN INTEGER
编辑:我更改了参数并收到与插入命令相关的新错误
CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
p_page_id IN INTEGER,
p_page_type IN VARCHAR2,
p_page_dcpn IN VARCHAR2)
RETURN INTEGER
IS
TABLE_DOES_NOT_EXIST exception;
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942
BEGIN
INSERT INTO
B2BOWNER.SSC_Page_Map VALUES(
p_page_id,
p_page_type,
p_page_dcpn);
错误
Errors for FUNCTION F_SSC_PAGE_MAP_INSERT
LINE/COL ERROR
-------- -----------------------------------------------------------------
17/18 PL/SQL: ORA-00942: table or view does not exist
16/5 PL/SQL: SQL Statement ignored
已在正确的架构中验证表,并使用正确的属性名称和类型
编辑:我执行了以下命令来检查我是否有访问权限
DECLARE
count_this INTEGER;
BEGIN
select count(*) into count_this
from all_tables
where owner = 'B2BOWNER'
and table_name = 'SSC_PAGE_MAP';
DBMS_OUTPUT.PUT_LINE(count_this);
END;
我收到的输出是
1
PL/SQL procedure successfully completed.
我可以使用这张桌子。
编辑:
所以我最终使用 PL/SQL 通过模式对表进行了插入,并且效果很好。看来我根本没有权限创建函数,但这是一个假设。
编辑:
实表DDL语句
v_create := 'CREATE TABLE ' || TABLE_NAME || ' (
PAGE_ID_NBR NUMERIC(10) NOT NULL Check(Page_ID_NBR > 0),
PAGE_TYPE VARCHAR2(50) NOT NULL,
PAGE_DCPN VARCHAR2(100) NOT NULL,
PRIMARY KEY(Page_ID_NBR, Page_Type))';
EXECUTE IMMEDIATE v_create;
COMMIT WORK;
COMMIT COMMENT 'Create Table';
【问题讨论】:
-
您没有包含任何会导致该错误的代码。这使得确定您可能导致该错误的原因变得相当困难。您能否也请发布实际错误而不是您对它的解释?
-
@Ben 从发布的错误中可以看出,这确实是一个真正的问题
-
我从不否认您遇到问题@Mushy,只是您没有提供足够的信息来解决问题。您发布的错误与所述的不同..它指出没有标识符
SSC_PAGE_MAP.PAGE_ID_NBR。您是否验证了架构 `B2BOWNER` 中表SSC_PAGE_MAP上的列PAGE_ID_NBR存在,并且您能够在创建此函数的架构中从该表中进行选择? -
@Ben 是的,在模式下验证为存在的表,可以作为 DDL 语句的目标,并且此类表的属性被验证为正确并与函数参数名称匹配。我能想到的唯一一件事是,如果以某种方式区分大小写,但我对此表示怀疑。
-
对于原始错误,它只是看起来列名是错误的,正如已经建议的那样 - 从函数参数名称中,你说它与表列匹配,也许
_nbr部分应该只是%type不在那里,但只有你可以查询数据字典才能看到。对于后面的错误,听起来您对通过角色而不是直接授予您的用户的表授予的权限 - 在 PL/SQL 手册中查找authid。