宝塔山 发表于 2024-12-10 10:29:12

办理oracle 存储过程报错:标识符无效。

目次
1、定义存储过程
2、错误形貌
3、办理方法①
4、办理方法②
5、演示正确的实行

1、定义存储过程

定义包:
https://i-blog.csdnimg.cn/direct/a5ab9b058ab344eda69a2bd0bdbf4ae5.png
图1-1
定义存储过程:
https://i-blog.csdnimg.cn/direct/d720de5eda4f4cefb3a47c4c8aa53118.png
图1-2
定义的包返回结果:
        对应图1-1
CREATE OR REPLACE Package PKG_AnyiR9   as
      type   AnyiResultSet   is   ref   cursor;   
      function GetData(vSql varchar2)return AnyiResultSet;   
    end   PKG_AnyiR9; 代码1-3
存储过程:
        对应图1-2
create or replace procedure delete_judge( in_gsdm in varchar2,
                                           in_djbhin varchar,
                                           in_kjnd in varchar2,

                                           pRecCur in out PKG_ANYIR9.ANYIRESULTSET )

is

vSQL varchar2(1000);
begin
      vSQL :='select count(*) num
      from GBI_ZBSYREC
       where GSDM = '||in_gsdm||'
       and KJND ='||in_kjnd||'
       and djbh ='||in_djbh||' ';

OPEN pRecCur FOR vSQL;
end; 代码1-4
2、错误形貌

测试时出现错误:标识符无效
https://i-blog.csdnimg.cn/direct/a3642c252f0142fe983a93f5a8a25b14.png
图2-1
实验在PL/SQL中办理:为入参加上单引号,确实可以办理。
https://i-blog.csdnimg.cn/direct/d15f4aab02ef4fb7be2224aa70b84eb2.png
图3-1
后端入参没有做处置惩罚,报错!
https://i-blog.csdnimg.cn/direct/759fe61e9cb3422b9b225b86ea568218.png
图4-1

3、办理方法①

在后端传参时使用转义字符增加单引号,如在PL/SQL中测试时那样:
实验在后端使用同样的方法办理标识符无效的报错:
https://i-blog.csdnimg.cn/direct/4236b4004e694d968a15153cb6464a1c.png
图5-1
可以在输出的SQL工具中看到,调用存储过程的入参:
https://i-blog.csdnimg.cn/direct/c8dc82790e424fabb569279a7892ebe7.png
图5-2
4、办理方法②

修改存储过程。
在入参的两侧分别增加一对单引号这样实行时就不能转为数值而发生标识符无效的报错。
相当于如测试时在入参双方增加了一个单引号。
这样做即使后端不做入参处置惩罚程序也能正常运行。
https://i-blog.csdnimg.cn/direct/3555dd98894b4019be131d7b55b8c867.png
图6-1
create or replace procedure delete_judge( in_gsdm in varchar2,
                                           in_djbhin varchar,
                                           in_kjnd in varchar2,

                                           pRecCur in out PKG_ANYIR9.ANYIRESULTSET )

is

vSQL varchar2(1000);
begin
      vSQL :='select count(*) num
      from GBI_ZBSYREC
       where GSDM = '||in_gsdm||'
       and KJND ='||in_kjnd||'
       and djbh ='''||in_djbh||''' ';

OPEN pRecCur FOR vSQL;
end; 代码6-2
代码6-2和代码1-4对比,可以清楚的发现是在入参的双方各增加了一个单引号。
思考其错误原因,是Oracle实行时会逼迫将字符转为数值,这里不能转换,因而发生了错误。
所以在此增加单引号告诉Oracle这是字符。
5、演示正确的实行

正常的实行如下:
https://i-blog.csdnimg.cn/direct/2cd3a40def24439f93df956f0276b761.png图7-1

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 办理oracle 存储过程报错:标识符无效。