我执行了一个创建下表的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
SQL:完整的PL/函数
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
insert EDIT:我更改了参数,并收到与命令相关的新错误
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
已在正确的方案中使用正确的属性名称和类型对表进行了验证
EDIT:我执行了以下命令来检查我是否有访问权限
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通过模式将insert插入到表中,它工作得很好。看起来我根本没有创建函数的权限,但这只是一个假设。
编辑:
实际表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';
发布于 2014-05-08 21:23:25
在B2BOWNER
下创建表时,请确保在PL/SQL函数前面加上模式名;即B2BOWNER.F_SSC_Page_Map_Insert
。
直到DBA指出后,我才意识到这一点。我可以在根用户/模式下创建表,PL/SQL函数就可以很好地工作了。
发布于 2014-08-12 14:49:06
在数据库中创建过程时,过程名称应为大写。在从Java类调用时,可以使用小写字母作为过程名称,如下所示:
String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";
在数据库中,过程的名称应为:
GETDBUSERBYUSERID -- (all letters in caps only)
这是解决这个问题的方法之一。
发布于 2017-06-15 19:32:31
您应该在您的数据库上授予权限
grant execute on (packageName or tableName) to user;
https://stackoverflow.com/questions/23526870
复制相似问题