昨天在学习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 raise'||(psssal+1000));
end;
/

想法是通过表的varchar(20)类型字段找到number类型字段,然后更改number类型的字段。表结构如下:

create table TESTDELETE
(
TESTID NUMBER,
TESTNAME VARCHAR2(20)
)

将存储过程调用,出现结果如下:


Connected to:
Oracle Database 11g Enterprise Edition Release 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))
2 AS
3 psssal TESTDELETE.TESTID%TYPE;
4 BEGIN
5 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 raise'||(psssal+1000));
8 end;
9 / Warning: Procedure created with compilation errors. SET SERVEROUTPUT ON;
BEGIN
RAISESALARY('name2091');
COMMIT;
END;
SQL> 2 3 4 5 /
RAISESALARY('name2091');
*
ERROR at line 2:
ORA-06550: line 2, column 5:
PLS-00905: object TEST.RAISESALARY is invalid
ORA-06550: line 2, column 5:
PL/SQL: Statement ignored SQL>

出现错误 :该存储过程无效。

what?明明刚刚建立的存储过程啊。然后我就翻到上面创建完之后的一句话,Warning: Procedure created with compilation errors. 翻译过来应该是:创建的过程带有编译的错误。

也就是说创建存储过程有错误,那么OK,找找存储过程看看哪错了。

emmmm,回头看了半天,就这么几行,死活没看出到底哪出问题了,没办法,baidu,google。

后来在StackOverFlow看到了这个,原文链接如下:

https://stackoverflow.com/questions/48497140/oracle-sql-stored-procedure-object-invalid

楼主在里面发现了这么一句话:

You can’t give a size or precision restriction for the data type of a formal parameter 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)
2 AS
3 psssal TESTDELETE.TESTID%TYPE;
4 BEGIN
5 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 raise'||(psssal+1000));
8 end;
9 / Procedure created. BEGIN
RAISESALARY('name2091');
3 COMMIT;
4 END;
5 /
The original salary2091 After the raise3091 PL/SQL procedure successfully completed. SQL>

改完之后明确看到已经没有warning了,出现的是   Procedure created.

运行成功!问题解决。

												

关于oracle PL/SQL存储过程 PLS-00905 object is invalid,statement ignored问题的解决的更多相关文章

  1. oracle pl/sql 存储过程

    存储过程用于执行特定的操作,当建立存储过程时,既可以指定输入参数(in),也可以指定输出参数(out),通过在过程中使用输入参数,可以将数据传递到执行部分:通过使用输出参数,可以将执行部分的数据传递到 ...

  2. Oracle PL/SQL 存储过程、函数、包 的范例

    1,写函数和过程,输入三角形三个表的长度.在控制台打印三角形的面积 -- 创建包 create or replace package pac_area is -- 定义计算三角形面积的过程 proce ...

  3. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  4. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  5. ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!)

    原文:ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) ORACLE PL/SQL编程之六: 把过程与函数说透(穷追猛打,把根儿都拔起!)   继上篇:ORACLE P ...

  6. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)

    原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...

  7. ORACLE PL/SQL编程详解(转)

    原帖地址:http://blog.csdn.net/chenjinping123/article/details/8737604 ORACLE PL/SQL编程详解 SQL语言只是访问.操作数据库的语 ...

  8. oracle pl/sql 程序设计 历史笔记整理

    20131016 周三 oracle pl/sql 程序设计 第2章 创建并运行pl/sql代码 sqlplus yjkhecc/yjkhecc@10.85.23.92:1521/orcl 在java ...

  9. [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)

    原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...

随机推荐

  1. Bitbucket与git上传源码的使用方法

    本文链接:https://blog.csdn.net/nomisshe/article/details/19625555 Bitbucket使用方法   一.软件及SSH keys: 由于我的Bitb ...

  2. 201871010113-刘兴瑞《面向对象程序设计(java)》第四周学习总结

    项目 内容 这个作业属于哪个课程 <任课教师博客主页链接>https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 <作业链接地址>http ...

  3. [C3W1] Structuring Machine Learning Projects - ML Strategy 1

    第一周:机器学习策略(1)(ML Strategy(1)) 为什么是ML策略?(Why ML Strategy) 大家好,欢迎收听本课,如何构建你的机器学习项目也就是说机器学习的策略.我希望通过这门课 ...

  4. appium Ui自动化调起应用点击

    appium Ui自动化调起微信并点击登录按钮的java代码(对的,就这么一丢丢). public class testWX { public static void main(String[] ar ...

  5. Java的 StringBuffer 和 StringBuilder 类

    https://www.runoob.com/java/java-stringbuffer.html 返回值是它本身的类, 所以可以链式调用! 总结就是可以直接在对象上使用 , 可以链式使用, buf ...

  6. ASP.NET开发实战——(七)ASP.NET与数据库

    在之前的文章中介绍了使用ASP.NET MVC来开发一个博客系统,并且已将初具雏形,可以查看文章列表页面,也可以点击文章列表的其中一篇文章查看详情,这已经完成了最开始需求分析的读者的查看列表和查看文章 ...

  7. 用scratch写了一个win98 界面模拟

    scratch模拟win98 玩耍,放在网上了https://kada.163.com/project/4216461-3515165.htm

  8. QFramework 学习

    github地址: https://github.com/liangxiegame/QFramework 框架官网: http://qf.liangxiegame.com/ 视频教程: http:// ...

  9. tomcat参数java_opts调整

    启动文件修改 在windows环境下,tomcat下的~/bin/catalina.bat文件,在文件头部加入: set "JAVA_OPTS=%JAVA_OPTS% -server -Xm ...

  10. 使用puppeteer爬取网页数据实践小结

    简单介绍Puppeteer Puppeteer是一个Node库,它通过DevTools协议提供高级API来控制Chrome或Chromium.Puppeteer默认以无头方式运行,但可以配置为有头方式 ...