关于oraclePLSQL存储过程PLS-00905objectisinvalid,sta。。。

更新时间:2023-05-07 03:29:54 阅读: 评论:0

关于oraclePLSQL存储过程PLS-00905objectisinvalid,sta。。
昨天在学习oracle存储过程的时候,写了⼀个存储过程的demo,语句是这样的:
CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR2(20))
AS
psssal TESTDELETE.TESTID%TYPE;
BEGIN
SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME;
UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;
DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the rai'||(psssal+1000));
end;
/
想法是通过表的varchar(20)类型字段找到number类型字段,然后更改number类型的字段。表结构如下:
create table TESTDELETE
(
TESTID  NUMBER,
TESTNAME VARCHAR2(20)
)
将存储过程调⽤,出现结果如下:
Connected to:
Oracle Databa 11g Enterpri Edition Relea 11.2.0.1.0- 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR2(20))
2AS
3      psssal TESTDELETE.TESTID%TYPE;
4BEGIN
5SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME;
UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;
DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the rai'||(psssal+1000));
8end;
9/
Warning: Procedure created with compilation errors.
SET SERVEROUTPUT ON;
BEGIN
RAISESALARY('name2091');
COMMIT;
END;
SQL>2345/
RAISESALARY('name2091');
*
ERROR at line 2:
ORA-06550: line 2, column5:
PLS-00905: object TEST.RAISESALARY is invalid
ORA-06550: line 2, column5:
PL/SQL: Statement ignored
SQL>
出现错误:该存储过程⽆效。
what?明明刚刚建⽴的存储过程啊。然后我就翻到上⾯创建完之后的⼀句话,Warning: Procedure created with compilation errors. 翻译过来应该是:创建的过程带有编译的错误。
也就是说创建存储过程有错误,那么OK,找找存储过程看看哪错了。
emmmm,回头看了半天,就这么⼏⾏,死活没看出到底哪出问题了,没办法,baidu,google。
后来在StackOverFlow看到了这个,原⽂链接如下:
楼主在⾥⾯发现了这么⼀句话:
You can’t give a size or precision restriction for to a function or procedure, so NUMBER(10,0) should just be NUMBER;
也就是说,你不能给函数和存储过程的参数指定数据的⼤⼩或者精度。OK,回头看看我这个参数,懂
了,varchar2(20)是明显的给参数的类型指定精度了。需要改成varchar2这种类型。
或者直接写表名.字段%TYPE 也是可以的(亲测)。
更改完之后运⾏如下:
CREATE OR REPLACE PROCEDURE RAISESALARY(PNAME IN VARCHAR)
2AS
3      psssal TESTDELETE.TESTID%TYPE;
4BEGIN
5SELECT TESTID INTO psssal FROM TESTDELETE WHERE TESTNAME=PNAME; UPDATE TESTDELETE SET TESTID=(TESTID+10000) WHERE TESTNAME=PNAME;    DBMS_OUTPUT.PUT_LINE('The original salary'||psssal||'    After the rai'||(psssal+1000)); 8end;
9/
Procedure created.
BEGIN
RAISESALARY('name2091');
3COMMIT;
4END;
5/
The original salary2091    After the rai3091
PL/SQL procedure successfully completed.
SQL>
改完之后明确看到已经没有warning了,出现的是Procedure created.
运⾏成功!问题解决。

本文发布于:2023-05-07 03:29:54,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/545065.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:过程   类型   创建   问题   参数   错误   指定
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图