请问一个存储过程execute immediate的问题

问题描述

CREATE OR REPLACE PROCEDURE INSERTAMOUNTTEST(v_region_code IN varchar2) ISBEGIN declare v_sql varchar2(33); begin v_sql := 'update aaa set x =112 where region_code = 571'; -- v_sql2 := 'update aaa set x = 6 where region_code = '''||v_region_code||''''; -- v_sql3 := 'update aaa set x = 4 where region_code = '||v_region_code; execute immediate v_sql; commit; end; commit;EXCEPTION WHEN OTHERS THEN commit;END;aaa表就是两个字段,一个number类型的x,还有一个varchar类型的region_code上面我定义的三个v_sql任何一个都更新不了,execute immediate v_sql;没有执行就进入了异常块,实在不知道是为什么,谢谢,还有我想问下 v_sql2写法后面4个单引号还有前面3个单引号对吗 问题补充:lzz7658823 写道

解决方案

请问v_region_code后面的4个单引号代表什么意思啊表示含有一个单引号(')的字符串
解决方案二:
如果v_region_code传进来的是571,那么在动态语句v_sql2中'''||v_region_code||'''的值就为'571'这样你就把update aaa set x = 6 where region_code='571'赋给了动态语句v_sql2;这个update语句本身就是用''单引号引起来的,所以v_region_code后面的第四个单引号是跟update前面的这个单引号匹配的把这个语句update aaa set x = 6 where region_code = '''||v_region_code||''' 用单引号括起来'update aaa set x = 6 where region_code = '''||v_region_code||''''赋给v_sql2;
解决方案三:
v_sql2 是正确的;如果v_sql2 := 'update aaa set x = 6 where region_code = '||v_region_code||'';那么传进来的参数就是=571,571就不会带引号,所以这个传入的参数这里必须是三个引号,动态sql里是用两个引号表示一个单引号的。所以正确的应该是:v_sql2 := 'update aaa set x = 6 where region_code = '''||v_region_code||'''';另外,你的v_sql定义的太小,这样有可能就不会执行动态sql;
解决方案四:
你的代码写的不标准啊,好多commit,还没有rollbackCREATE OR REPLACE PROCEDURE INSERTAMOUNTTEST(v_region_code IN VARCHAR2) IS v_sql VARCHAR2(100);BEGIN -- 能直接sql,就不要用动态sql UPDATE aaa SET x = 7 WHERE region_code = v_region_code; -- 使用绑定变量的动态sql,多使用在循环中,能够减少循环的开销. v_sql := 'update aaa set x = 6 where region_code = :1'; EXECUTE IMMEDIATE v_sql USING v_region_code; -- 就是动态sql了 v_sql := 'update aaa set x = 6 where region_code = ''' || v_region_code || ''''; EXECUTE IMMEDIATE v_sql; COMMIT;EXCEPTION WHEN OTHERS THEN ROLLBACK;END;
解决方案五:
你定义的v_sql是varchar2(33),赋值的字符串都大于33了,能不报错吗sql2正确啊,plsql中,字符串用俩个单音号表示的,如果你的字符串含有单引号,那么用两个单引号表示一个单引号,比如v_region_code='571'v_sql2 := 'update aaa set x = 6 where region_code = '''||v_region_code||'''';把''替换成',那么直接执行的sql: v_sql2 := 'update aaa set x = 6 where region_code = '571'

时间: 2024-10-24 11:16:32

请问一个存储过程execute immediate的问题的相关文章

如何在启动SQL SERVER时自动执行一个存储过程

    本文解答如何在启动SQL SERVER的时候,执行一个存储过程的问题. 如何在启动SQL SERVER的时候,执行一个存储过程? 将存储过程创建在master数据库中,然后企业管理器中找到这个存储过程--右键--属性--勾选"每当sql server启动时执行". 或者在master中创建存储过程后,执行语句设置为自动启动 use masterexec sp_procoption '存储过程名','startup','on' 自动执行存储过程 SQL Server 启动时可以自

请问一个vc++数据类型的问题

问题描述 请问一个vc++数据类型的问题 我看书上说过,类型unsigned int 可以缩写为unsigned,请问下这话对吗?还是印刷错了 解决方案 对的,unsigned int可以缩写成unsigned;long int可以写成long等等,这个记住就行了,感觉回答满意记得采纳哦 解决方案二: ......对的......

基础-请问一个C语言奇怪的问题,求大神

问题描述 请问一个C语言奇怪的问题,求大神 //加了所有需要的头文件intmain(int argc char **argv){ struct event timeout; struct timeval tv; struct event_base *base; int flags; //printf(""pathvar=%s""getenv(""PATH"")); 注释1#ifdef WIN32 WORD wVersionRe

ios-iOS:请问一个线程涉及2个类,如何向该线程performSelecto?

问题描述 iOS:请问一个线程涉及2个类,如何向该线程performSelecto? 我有一个线程,这线程首先是在a类中创建,并调用a类的a1方法,而a1方法又调用了b类的b1方法. 我在c类中,想向该线程发通知,希望其调用b类的b2方法, 我的代码: [self performSelector:@selector(b2) onThread:m_thread withObject:nil waitUnitilDone:NO]; 提示:unrecognized selector to instan

用SQL语句获得一个存储过程返回的表

定义一个存储过程如下: create proc [dbo].[test1]@id intasselect 1 as id,'abc' as name union all select @id as id,'zzz' as name 返回两行数据.现在想用SQL语句来调用这个存储过程,并把他返回的表放入变量中.可以如下做: declare   @table   table(id   int,name varchar(50))--定义表变量来存放存储过程返回的内容insert  into @tabl

请问一个web工程中,是否可同时使用struts1和struts2?

问题描述 请问一个web工程中,是否可同时使用struts1和struts2? 请问一个web工程中,是否可同时使用struts1和struts2? 解决方案 理论上可以,但是要非常小心,比如重名的类型,还有url映射和配置文件.建议你独立成两个网站,互相调用. 解决方案二: 最好是不要同时使用, 很容易出错. 解决方案三: 应该可以,你确定这样用了方便以后维护吗? 解决方案四: struts2不是夸张1吗,有需要给自己找麻烦吗 解决方案五: 在原来的struts1的项目上需要新功能,你想用st

c++-请问一个MFC中的DC的问题

问题描述 请问一个MFC中的DC的问题 void CmouselessionDlg::OnMouseMove(UINT nFlags, CPoint point) { if (nFlags ==MK_LBUTTON) { dd.MoveTo(pt); dd.LineTo(point.x,point.y); } pt = point; CDialogEx::OnMouseMove(nFlags, point); } 请问下这个程序对么?pt和dd都定义了 解决方案 没问题呀,那个dd应该是个CDC

强制转换-请问一个关于指针操作数据的问题!

问题描述 请问一个关于指针操作数据的问题! 嵌入式程序,编译器IAR,CPU 瑞萨unsigned char a[]={0x010x020x030x040x050x06};int test(void){ unsigned short *p=(unsigned short *)(&a[1]); unsigned short temp=p[0];//此时编译器Watch 里面 p[0]=0x0302 temp=0x0201 if(0x0302==p[0])//走else { //do somethi

请问一个android问题 一个应用能否只占用一个设备显示屏的一部分

问题描述 请问一个android问题 一个应用能否只占用一个设备显示屏的一部分 也就是说屏幕中同时显示两个应用...设备同时运行两个应用,而且同时显示出来. 解决方案 不行,机制上只能有一个activity 解决方案二: 不行,只能跑起来一个ACtivity