昨天在学习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. gdb x命令使用方法

    x命令是直接查看指定地址为开头的内存里的内容 既然是要看,就分你想怎么看,和看多少 怎么看: d 按十进制格式显示 x 按十六进制格式显示 a 按十六进制格式显示 u 按十六进制格式显示无符号整型 o ...

  2. arm-linux-gcc-5.4.0安装方法

    首先需要下载arm-linux-gcc的安装包 这里提供一个5.4.0版本的安装包,如有需要自行下载. 下载链接:https://pan.baidu.com/s/1prpdmVNWBFzg79OXQs ...

  3. 13. 抽象类 & 接口

    一.抽象类 // 抽象类Shape public abstract class Shape { // 1. 成员变量 private String color; // 2. 初始化块 { System ...

  4. slot 的简单使用(一)匿名插槽

    slot 是父组件与子组件的通选方式可以将父组件的内容显示在子组件当中或者说可以将 让你封装的组件变的更加的灵活,强壮! 组件 slot-exmple.vue <template> < ...

  5. selenium截取元素

    http://www.mamicode.com/info-detail-2161474.html 常见问题 https://blog.csdn.net/u010616442/article/detai ...

  6. Html学习之十六(表格与表单学习--课程表制作)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 富文本编辑器Simditor

    文档地址:https://simditor.tower.im/docs/doc-usage.html 父组件: options: { placeHolder: 'this is placeHolder ...

  8. 《阿里如何实现秒级百万TPS?搜索离线大数据平台架构解读》--阅读

    离线?在阿里搜索工程体系中我们把搜索引擎.在线算分.SearchPlanner等ms级响应用户请求的服务称之为“在线”服务:与之相对应的,将各种来源数据转换处理后送入搜索引擎等“在线”服务的系统统称为 ...

  9. Python socket & socket server

    socket 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket(套接字). 建立网络通信连接至少要一对socket.socket是对TCP/IP的封装 使用方法 ...

  10. 洛谷P4015 运输问题 网络流24题

    看了下SPFA题解,一个一个太麻烦了,另一个写的很不清楚,而且注释都变成了"????"不知道怎么过的,于是自己来一发SPFA算法. Part 1.题意 M 个仓库,卖给 N 个商店 ...