热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

oracle游标加入字符串,超级困难:存储过程中执行SQL字符串游标或临时表期待解决...

第一种情况是游标的情况:大体说明是传进来N个参数然后根据N个参数来组合一个带有一个游标的SQL语句来循环取出数据执行另一条函数(这块不在这个问题里面)第二种情况是临时表的情况:大体

第一种情况是游标的情况:大体说明是传进来N个参数 然后根据N个参数来组合一个带有一个游标的SQL语句来循环取出数据 执行另一条函数(这块不在这个问题里面)

第二种情况是临时表的情况:大体说明是传进来N个参数 然后根据N个参数来组合一个Select SQL语句,将这个Select 语句结果转成一个临时表,再遍历临时表取出数据 执行另一条函数(这块不在这个问题里面)

以上两种SQL语句在SQL 2000 有办法解决 .不知道Oracle怎么解决.很奇怪 总是提示这样,那样的问题.

以下为两种SQL语句的简洁

第一种:

-----------------------------------------------------------------

CREATE OR REPLACE PROCEDURE GetPositionInfo

(

v_Voyage varchar2,

v_CntrStatusCode varchar2,

v_CntrSize varchar2,

v_CntrType varchar2,

v_EF varchar2,

v_OptrCode varchar2,

returnstr out varchar2

)IS

tempstr varchar2(2000);

orderstr varchar2(200);

v_bayid number(12,0);

begin

returnstr := '';

tempstr := 'declare cursor cur is Select BayID from TPlCtrl where CntrSize=v_CntrSize and EF=v_EF and TaskCode=v_TaskCode';

orderstr := '';

--以下是按照传进来的条件来进行组织SQL语句.

if v_Voyage <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (Voyage&#61;v_voyage or nvl(Voyage,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,Voyage desc&#39;;

else

orderstr :&#61; &#39; Order by Voyage desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,Voyage &#39;;

else

orderstr :&#61; &#39; Order by Voyage &#39;;

end if;

end if;

if v_CntrStatusCode <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (CntrStatusCode&#61;v_CntrStatusCode or nvl(CntrStatusCode,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CntrStatusCode desc&#39;;

else

orderstr :&#61; &#39; Order by CntrStatusCode desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CntrStatusCode &#39;;

else

orderstr :&#61; &#39; Order by CntrStatusCode &#39;;

end if;

end if;

if v_CNTRType <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (CNTRType&#61;v_CNTRType or nvl(CNTRType,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CNTRType desc&#39;;

else

orderstr :&#61; &#39; Order by CNTRType desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CNTRType &#39;;

else

orderstr :&#61; &#39; Order by CNTRType &#39;;

end if;

end if;

if v_OPTRCode <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (OPTRCode&#61;v_OPTRCode or nvl(OPTRCode,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,OPTRCode desc&#39;;

else

orderstr :&#61; &#39; Order by OPTRCode desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,OPTRCode &#39;;

else

orderstr :&#61; &#39; Order by OPTRCode &#39;;

end if;

end if;

orderstr:&#61;orderstr || &#39;,Pri asc&#39;;

tempstr :&#61; tempstr || orderstr;

--以上为组织完SQL语句.以下进行执行.

execute immediate tempstr;

begin

--问题出在下面的这条语句.说没有定义这个游标.可是我把这个游标定义在那个字符串里面了.应该怎么办.

open cur;loop

fetch cur into v_bayid;

CheckPosition(v_TaskTypeCode,to_char(v_bayid),v_CntrStatusCode,v_CntrSize,v_CntrType,v_EF,v_OptrCode,tempstr);

if substr(tempstr,1,1) &#61; &#39;#&#39; then

returnstr :&#61; tempstr;

else

returnstr :&#61; tempstr;

close cur;

return ;

end if;

end loop;

close cur;

end;

END GetPositionInfo;

第二种:

-----------------------------------------------------------------

CREATE OR REPLACE PROCEDURE GetPositionInfo

(

v_Voyage varchar2,

v_CntrStatusCode varchar2,

v_CntrSize varchar2,

v_CntrType varchar2,

v_EF varchar2,

v_OptrCode varchar2,

returnstr out varchar2

)IS

tempstr varchar2(2000);

orderstr varchar2(200);

v_bayid number(12,0);

begin

returnstr :&#61; &#39;&#39;;

tempstr :&#61; &#39;insert into temptable Select BayID from TPlCtrl where CntrSize&#61;v_CntrSize and EF&#61;v_EF and TaskCode&#61;v_TaskCode&#39;;

orderstr :&#61; &#39;&#39;;

--以下是按照传进来的条件来进行组织SQL语句.

if v_Voyage <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (Voyage&#61;v_voyage or nvl(Voyage,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,Voyage desc&#39;;

else

orderstr :&#61; &#39; Order by Voyage desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,Voyage &#39;;

else

orderstr :&#61; &#39; Order by Voyage &#39;;

end if;

end if;

if v_CntrStatusCode <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (CntrStatusCode&#61;v_CntrStatusCode or nvl(CntrStatusCode,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CntrStatusCode desc&#39;;

else

orderstr :&#61; &#39; Order by CntrStatusCode desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CntrStatusCode &#39;;

else

orderstr :&#61; &#39; Order by CntrStatusCode &#39;;

end if;

end if;

if v_CNTRType <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (CNTRType&#61;v_CNTRType or nvl(CNTRType,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CNTRType desc&#39;;

else

orderstr :&#61; &#39; Order by CNTRType desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,CNTRType &#39;;

else

orderstr :&#61; &#39; Order by CNTRType &#39;;

end if;

end if;

if v_OPTRCode <>&#39;&#39;  then

tempstr :&#61; tempstr || &#39; and (OPTRCode&#61;v_OPTRCode or nvl(OPTRCode,&#39;&#39;&#39;&#39;)&#61;&#39;&#39;&#39;&#39;)&#39;;

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,OPTRCode desc&#39;;

else

orderstr :&#61; &#39; Order by OPTRCode desc&#39;;

end if;

else

if orderstr <> &#39;&#39; then

orderstr :&#61; orderstr || &#39; ,OPTRCode &#39;;

else

orderstr :&#61; &#39; Order by OPTRCode &#39;;

end if;

end if;

orderstr:&#61;orderstr || &#39;,Pri asc&#39;;

tempstr :&#61; tempstr || orderstr;

--以上为组织完SQL语句.以下进行执行.

execute immediate &#39;CREATE GLOBAL TEMPORARY TABLE temptable (bayid number(12,0)) from ON COMMIT PRESERVE ROWS&#39;;

execute immediate tempstr;

--问题出在下面的那一条语句.说没有这个名字的临时表.可是这个临时表已经在上面的那个字符串里面定义了.

declare cursor cur is Select bayid from temptable;--如果把上面的这条语句也放在一个字符串里面执行的话,就会提示下面的 Open cur 不存在 没有定义.我总不能把下面所有的语句都用字符串来执行吧.

begin

open cur;

loop

fetch cur into v_bayid;

CheckPosition(v_TaskTypeCode,to_char(v_bayid),v_CntrStatusCode,v_CntrSize,v_CntrType,v_EF,v_OptrCode,tempstr);

if substr(tempstr,1,1) &#61; &#39;#&#39; then

returnstr :&#61; tempstr;

else

returnstr :&#61; tempstr;

close cur;

return ;

end if;

end loop;

close cur;

end;

END GetPositionInfo;

&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;&#61;

请各位专家帮忙解决.问过身边很多搞Oracle的他们都没有办法解决.



推荐阅读
  • Python操作MySQL(pymysql模块)详解及示例代码
    本文介绍了使用Python操作MySQL数据库的方法,详细讲解了pymysql模块的安装和连接MySQL数据库的步骤,并提供了示例代码。内容涵盖了创建表、插入数据、查询数据等操作,帮助读者快速掌握Python操作MySQL的技巧。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • Oracle 和 mysql的9点区别【MySQL】
    数据库|mysql教程oracle,Oracle,money,mysql,coun数据库-mysql教程1.组函数用法规则mysql中组函数在select语句中可以随意使用,但在o ... [详细]
  • 数据库技术:execute immediate
    首先在这里发发牢骚,指责下那些刻板的书写方式,不考虑读者理不理解,感觉就是给专业人员用来复习用的一样,没有前戏,直接就高潮,实在受不了!没基础或基础差的完全不知道发生了什么,一脸懵 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • PLSQL块:PLSQL块都用于解决特定问题,PLSQL块可以有参数,也可以相互调用。PLSQL块可以作为模式对象在Oracle数据库中保存,根据用途可以 ... [详细]
  • 开发笔记:select from具体执行相关知识介绍及案例分析
    本文由编程笔记小编整理,主要介绍了select from具体执行相关的知识,包括数据插入、查询最小rowID、查询每个重复名字的最小rowID、删除重复数据等操作,并提供了案例分析。希望对读者有一定的参考价值。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 总结一下C中string的操作,来自〈CPrimer〉第四版。1.string对象的定义和初始化:strings1;空串strings2(s1);将s2初始 ... [详细]
  • scrapy 采集入为库 mysql 数据库,只更新一个字段 提示这个语法错误?
    就是查询有没有这个字,如果查到这个字就更新这个字的bsmc字段表是news_topic插入代码如下: ... [详细]
  • 1、PLSQLDeveloper记住登陆密码在使用PLSQLDeveloper时,为了工作方便希望PLSQLDeveloper记住登录Oracle的用户名和密码&#x ... [详细]
author-avatar
小样2502857665
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有