oraclemysql 存储过程 游标取出多个游标的数据后插入到表e中 比如 我有游标a,b,c,d 在游标a,b,c,d都有e要的数据,想把

Oracle如何把从表A读取出来的若干条数据循环插入到B表中_百度知道
Oracle如何把从表A读取出来的若干条数据循环插入到B表中
表A中有多少ID值,每条数据都有ID。表B有列字段为JLID,现需要把表A中ID的值插入到表B的JLID字段中,该如何写?(注如:表A有若干条数据
我有更好的答案
语句如下:insert into B as select * from A;解释:B表的表结构必须和A表的 相同,否则无法插入。可以优化语句:insert into B(id,name) as select
A.id,A.name from A;
采纳率:81%
要写完整点,那就是INSERT
A解决问题INSERT
'测试数据&#39, jlid)
'测试数据&#39
本回答被提问者采纳
04LIS@ motcore13&gt,id from wcy_t1;已创建2行。已用时间: 00: 00。已用时间:
00,room varchar2(30));表已创建;测试数据';表已删除。已用时间LIS@ motcore13& drop table wcy_t1。已用时间:
00: 00; create table wcy_t2(jlid number,name varchar2(30)),'b');已创建 1 行。已用时间:
00: 00: 00.21LIS@ motcore13& create table wcy_t1(表已创建。已用时间: 00,jlid) select &#39,'a');已创建 1 行。已用时间; drop table wcy_t2;表已删除.07LIS@ motcore13&gt:
00: 00: 00.01LIS@ motcore13& insert into wcy_t1 values(128:
00: 00: 00.04LIS@ motcore13& insert into wcy_t1 values(123:
00: 00: 00.01LIS@ motcore13& insert into wcy_t2(name
INSERT INTO B(JLID) SELECT ID FROM A
试验结果是:单场子查询返回多个行!
INSERT INTO B(Name, JLID) SELECT '测试数据', ID FROM A
insert into B(JLID) select rownum from A
试验结果是:单场子查询返回多个行!
nto table3(number,str) select table1.number,table2.str from table1,table2 where table1.str='aaa' and table2.number=table1.number关键是那些字段填什么值,如果是固定的,可以在SELECT里面用常量表示,比如:insert into table3(number,str,aaa,ccc,vvv) select table1.number,table2.str,111,222,333 from table1,table2 where table1.str='aaa' and table2.number=table1.number另外,站长团上有产品团购,便宜有保证
insert into B(JLID)select id from A;这样就可以了。一条SQL语句就可以搞定。不明白的可以问我。
试验结果是:单场子查询返回多个行!
没有问题的,多个行都会插入到B表中。如果你非要从A表选一行,然后再插入到B中的话,可以使用oracle的游标,游标可在存储过程中实现。
不用返回结果集,个人认为用不着游标。按道理应该用数组之类的东西,写个循环什么的,把读到的值一个一个的插入。
可以啊,存储过程以及pro*c编程中都可以声明数组变量,将多结果集写到一个数组变量里。
我需要最终的答案。
如果你不急的话,明天给你,下班了。
其他6条回答
为您推荐:
其他类似问题
oracle的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。游标在Oracle数据库存储过程中的作用_西西软件资讯
西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ 游标在Oracle数据库存储过程中的作用
类型:休闲益智大小:113M语言:中文 评分:10.0
作为关系型市场的老大,Oracla占有举足轻重的地位。虽然在操作上不如SQLSERVER那样方便,但是他的强大的功能,还是吸引来大批大批的追随着。本人作为ORACLE菜鸟,在工作当中也偶尔使用Oracle。以下记录的上由于工作需要写的Oracle的&br&使用游标的储存过程,个人觉得比较有代表性。希望给初学者一定的帮助,也给自己加深一下印象。在ORACLE中,他以一个语句块为一个默认的事务。也就是说,如果你就单单只执行一段ORACLE的语句块,他默认是以事务的形式执行的。01 CREATE OR REPLACE PROCEDURE sp_EditInlayOut( 02 FID NUMBER, --修改记录的ID T_INLAYOUT表的主键 03 InlayBoxIDs varchar2, --修改的记录 04 BoxCount number, --装箱数量 05 ApplyUserID varchar2, --申请人编号 06 StoreUserID varchar2, --库管编号 07 ConfirmState char, --确认状态 08 ExistState char, --存在状态 09 strErr OUT varchar2 --存储过程执行结果。成功返回空,失败返回错误原因 10 ) 11 AS 12 --定义变量 13 v_Now DATE; 14 v_Now2 15 v_LogID 16 v_ChipID 17 v_sql varchar2(2000); 18 BEGIN 19 20 --记录日志 21 INSERT INTO T_InlayOut_Log(F_InlayBoxIDs,f_Boxcount,f_Applyuserid,f_Storeuserid,f_Addtime,f_Confirmstate 22 ,f_Existstate, f_modifyid, f_modifytime, f_modifyuserid ) 23 ((SELECT F_InlayBoxIDs,f_Boxcount,f_Applyuserid,f_Storeuserid,f_Addtime,f_Confirmstate,f_Existstate 24 ,FID,SYSDATE,StoreUserID FROM T_InlayOut WHERE F_ID=FID)); 25 --取刚插入记录的ID 26 select seq_t_inlayout_log.currval into v_LogID 27 --定义游标 28 DECLARE CURSOR myCusor IS SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID IN (SELECT f_ID FROM 29 T_InlayBox where F_InlayOutID = FID); 30 --开始使用游标取数据 31 BEGIN 32 OPEN myC 33 34 LOOP 35 FETCH myCusor INTO v_ChipID; 36 --游标取不到数据则退出 37 EXIT WHEN myCusor%NOTFOUND; 38 39 SELECT MIN(F_CurrentTime) INTO v_Now FROM t_Chipstatehistory WHERE 40        (F_HistoryState = 'Confirm_InlayIn') AND F_ChipID = v_ChipID; 41 --改变芯片表的状态 42 UPDATEt_chip SET f_State = 'Confirm_InlayIn',F_CompareTime = v_Now WHERE F_ID = v_ChipID; 43 --保存芯片状态历史记录 44 INSERT INTO T_CHIPSTATEHISTORY(f_chipid, f_Historystate,F_TABLEID,f_Currenttime,F_TABLENAME) 45 VALUES 46 (v_ChipID,'Confirm_InlayIn',v_LogID,SYSDATE,'T_InlayOut_Log'); 47 48 END LOOP; 49 CLOSE myC 50 END; 51 52 --选择最近芯片状态变更时间 53 --SELECT MIN(F_CURRENTTIME) INTO v_NOW FROM T_CHIPSTATEHISTORY WHERE F_HISTORYSTATE = 20 54 AND F_CHIPID IN (SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID=(SELECT F_ID FROM T_InlayBox 55 WHERE F_InlayOutID=FID)); 56 57 --将芯片表中芯片状态更新到以前状态 58 --UPDATE T_CHIP SET F_State=20,F_CompareTime=v_NOW WHERE F_InlayBoxID IN (SELECT F_ID FROM 59 T_InlayBox WHERE F_InlayOutID =FID); 60 --记录芯片状态变更日志 61 --INSERT INTO T_ChipStateHistory (F_ChipID,f_Historystate,f_Tableid,f_Currenttime,f_Tablename)VALUES 62 --((SELECT F_ID FROM T_CHIP WHERE F_InlayBoxID=(SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID)), 63 20,v_LogID,SYSDATE,'T_InlayOut_Log'); 64 65 66 --将Inlay出库箱表中以前的数据更新到以前状态 67 UPDATE T_InlayBox SET F_State=2,F_InlayOutID=null WHERE F_InlayOutID =FID; 68 69 --编辑时将新的INLAY出库信息更新 70 UPDATE T_InlayOut SET F_InlayBoxIDs=InlayBoxIDs,f_Boxcount=BoxCount,f_Applyuserid=ApplyUserID, 71 f_Storeuserid=StoreUserID,f_Confirmstate=ConfirmState,F_ExistState=ExistState,F_ConfirmTime=null 72 WHERE F_ID=FID; 73 74 --更新T_InlayBox 新的状态 75 --UPDATE T_InlayBox SET F_State=3,F_InlayOutID=FID WHERE F_ID in (InlayBoxIDs); 76 v_sql := 'UPDATE T_InlayBox SET F_State=3,F_InlayOutID='||FID||' WHERE F_ID in ('||InlayBoxIDs||')'; 77 --立即执行v_sql 78 EXECUTE IMMEDIATE v_ 79 80 SELECT SYSDATE INTO v_Now2 FROM DUAL; 81 --更新芯片表状态 82 UPDATE T_Chip SET F_State='No_Confirm_InlayOut',F_CompareTime=v_Now2 WHERE F_InlayBoxID IN 83 (SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID); 84 --记录当前操作日志 85 INSERT INTO T_ChipStateHistory (F_ChipID,f_Historystate,f_Tableid,f_Currenttime,f_Tablename) 86 SELECT F_ID,'No_Confirm_InlayOut',v_LogID,v_Now2,'T_InlayOut_Log' FROM T_CHIP WHERE F_InlayBoxID IN 87 (SELECT F_ID FROM T_InlayBox WHERE F_InlayOutID=FID); 88 --提交 89 COMMIT; 90 --发生异常时返回错误码 91 EXCEPTION 92 WHEN OTHERS THEN 93 strErr := substr(sqlerrm,1,100); 94 ROLLBACK; 95 END sp_EditInlayO 但是在SQLSERVER中,除非你将所有的T-SQL语句块以显示的方式【BEGIN TRANSACTION ....END TRANSACTION】申明在事务中,否则SQLSERVER会将语句块中的每一句作为一个单独的默认事务执行。 此外,游标是一种比较占I/O资源的操作,使用完后应该及时关闭,以释放系统资源。
02-2402-2202-21深入Lazy――.NET Framework 4.002-1602-0101-2701-2701-2501-1301-12
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载博客访问: 149949
博文数量: 68
注册时间:
做个有思想的程序员
ITPUB论坛APP
ITPUB论坛APP
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: Linux 13:24:00
在sql server转oracle存储过程改造中, 由于返回数据集操作比较频繁,针对效率及改造工作量寻求一较好的方式
代码片段:
SELECTcountry_code,
country_id&&&&& country_id,
country_name&&& country_name,
lang_en&&&&&&&& lang_name,
country_name_sc country_name_sc,
lang_sc&&&&&&&& lang_name_sc
ORDERBYASC
1,游标取出是运行程序真正得到游标进行数据遍历才进行的,可能造成占用数据库时间过长。
2,若open游标是从一些事务临时表进行取数时,而存储过程在结束有commit操作时,则游标数据丢失。
3,若程序中要根据此游标数据条数进行判断操作时,则必须再对此SQL进行统计操作,无法用游标做结果判断。
selectcount1intofrom
1--information not ready
openforselect
ip_addr1, ip_addr2, ip_addr3, ip_addr4,
block_connection, heartbeat_interval, reconnect_interval,
timeout_recv, xml_convert_Big5, group_id
fromwhere1
一,结构化数组
说明:定义好与返回相同列的二维数组
大致代码:
typeisrecord
command_id NUMBER5
xmlcode_id NUMBER5
sports_id& NUMBER5
pool_id&&& NUMBER5
xml_name&& VARCHAR250
force_flag NUMBER10
TYPEISTABLEOF
la_msn_arr tab_msn_setA
SELECT&&command_id ,
xmlcode_id ,
sports_id ,
xml_name ,
force_flag& &&BULKCOLLECTinto
--此处是可以根据SQLROWCOUNT进行判断的,open游标是不能这样判断,因为当时是没有执行的
ifSQLROWCOUNT0then
1--information not ready
要定义太多类型,且与select查询一致,且公用调用返回类型时,不能通用化
程序执行占用数据库连接时间相对过短。
可对结果集进行操作或判断。
二,非结构化数组
说明:所以返回类型都为一个通用二维数组,
大致代码:
CREATEORREPLACETYPEISTABLEOFVARCHAR2100
CREATEORREPLACETYPEISTABLEOF
SELECT&&&&&&&&command_id ,
xmlcode_id ,
sports_id ,
xml_name ,
force_flag& &&BULKCOLLECTinto
所有类型基于为varchar2(100),比较死板,且长度要定义查询出来的最大长度
程序执行占用数据库连接时间相对过短。
额外编码量小,公共调用通用化。
可对结果集进行操作或判断。
基于一些考虑,目前查询的内容基于为字符型(且数字也可隐式转为字符).因此感觉方案二较优,倾向于采用此方案。
Pl/sql部分:
CREATEORREPLACETYPEISTABLEOFVARCHAR2100
CREATEORREPLACETYPEISTABLEOF
CREATEORREPLACEPROCEDUREOUT
lt_table2 OUT
SELECTtp_record (command_id, xmlcode_id, sports_id, pool_id, xml_name, force_flag) BULKCOLLECT& --一次性数据装载于数组
ORDERBYASCASC
JAVA调用部分:
package com.
import java.sql.C
import java.sql.SQLE
import oracle.jdbc.driver.OracleCallableS
import oracle.jdbc.driver.OracleT
import oracle.sql.ARRAY;
import com.piliskys.dataStore.ConnectionU
public class TestArrDb {
&&& &* @param args
&&& &* @throws SQLException
&&& public static void main(String[] args) throws SQLException {
&&&&&& // TODO Auto-generated method stub
&&&&&& //此处得到一个数据库连接,
&&& &Connection conn= ConnectionUtil.currentConnection("ihs_vm134");
&&&&&& &OracleCallableStatement stmt =(OracleCallableStatement) conn.prepareCall("begin p_test_001(?,?);");&
&&& //注册两输出参数
&&&&&& &stmt.registerOutParameter( 1, OracleTypes.ARRAY,"TP_TABLE" );
&&&&&& &stmt.registerOutParameter( 2, OracleTypes.ARRAY,"TP_TABLE" );
&&&&&& &stmt.execute();&&
&&&&&& &ARRAY simpleArray = stmt.getARRAY(1);
&&&&&& &ARRAY simpleArray2 = stmt.getARRAY(2);
&&&&&& //第二个输出没有赋值,内容是为空的
&&&&&& && System.out.println(& "simpleArray2="+simpleArray2);
&&&&&& //转换为java数组,应先判断是否为空操作,,,此处略
&&&&&& &Object[ ] values = (Object[])simpleArray.getArray();
&&&&&& //输出数组内容&&&&& &&&&&&&&&&& for( int i = 0; i < values.length; i++ )
&&&&&& &&&&&&&&&&& {
&&&&&& &&&&&&&&&&& & Object[] ff= (Object[] ) ((ARRAY)values[i]).getArray();
&&&&&& &&&&&&&&&&& & &&for( int j = 0; j < ff.length; j++ )
&&&&&& &&&&&&&&&&&& System.out.println( "row[" + i +","+j+ "] = '" + ff[j] +"'" );
&&&&&& &&&&&&&&&&& }
&& 内存跟长度定义无关,
&& 当采用java连接池操作时,数组内存不易释放,而游标是取完自己内存加收的
后来再进行一些测试发现:
针对我上次说的游标三个不好之处
1,游标取出是运行程序真正得到游标进行数据遍历才进行的,可能造成占用数据库时间过长。
这个我测试,用java程序运行存储过程及得到游标数据时间,比运行存储过程得到数组时间还短, 而且游标的方式是一用完内存就释放的,
这一点,游标应该更有优势。
2,若open游标是从一些事务临时表进行取数时,而存储过程在结束有commit操作时,则游标数据丢失。
&&&&& &对于这个,如果要采用游标方式,则临时表改为会话级,使用时先在truncate此临时表,当然,这样退出的时候,数据还保存在临时表中,会占用临时表空间,如数据量不大应该没有问题,另,如用事务临时表,遇到此情况也可由应用程序来commit,
3,若程序中要根据此游标数据条数进行判断操作时,则必须再对此SQL进行统计操作,无法用游标做结果判断。
&&&&&&& 这个选择游标是必要的过程。
&------------------------------------------------
&总体感觉,现在看来,使用游标的坏处好像也没有什么!:)
阅读(6832) | 评论(0) | 转发(1) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。职友集:让工作决策更聪明豆丁微信公众号
君,已阅读到文档的结尾了呢~~
vfp期末复习大全(可编辑),大学物理期末复习题,初一数学期末复习卷,九年级物理期末复习,三年级数学期末复习,vfp函数大全,vfp命令大全,vfp中sql语句大全,编辑个性签名大全,qq编辑个性签名大全
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
vfp期末复习大全(可编辑)
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 oracle游标和存储过程 的文章

 

随机推荐