oracle存储过程中动态SQL Insert Into 的问题(No 2 急!!!)

TechnoFantasy 2002-03-23 12:18:18
加精
对于varchar类型数据的插入,一般的Insert Into只需要:
INSERT INTO TBNAME (VARC1,VARC2) VALUES ('s1', 's2')
就可以了,但是动态SQL中应该怎么操作,我的存储过程是这样的:


CREATE or replace procedure proInsertCustInfo(
v_Names in VARCHAR2,
v_Values in VARCHAR2) IS
v_Cursor NUMBER;
v_CreateString VARCHAR2(500);
vID number;
begin
v_Cursor := DBMS_SQL.OPEN_CURSOR;
v_CreateString := 'INSERT INTO CSCUSTOM ( CUSTID, CUSTSTATDATE, ' || v_Names || ')' || ' VALUES (custom_id_seq.nextval,

sysdate, ' || v_Values || ')';
DBMS_SQL.PARSE(v_Cursor, v_CreateString, DBMS_SQL.NATIVE);
DBMS_SQL.CLOSE_CURSOR(v_Cursor);

commit work;
end proInsertCustInfo;

我现在需要在java中调用,

附java代码:

Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection ("jdbc:oracle:thin:@172.18.8.4:1521:ORCL", "scott","tiger");
CallableStatement procnone = conn.prepareCall ("begin proInsertCustInfo(?,?,?); end;");
procnone.setString(1, m_Names);
procnone.setString(2, m_Values);

procnone.execute();


上面的存储过程是正确的,我将我的Java代码中的m_Names和m_Values直接copy到sql*plus work sheet中执行insert into操作完全正确,在

sql*plus中执行存储过程也没有问题,但是无法插入数据,现在的问题据我看是在v_Values上面。
假设我要传 3个参数(全是varchar2型):值分别是:hello, you, are
正常的sql是insert into CSCUSTOM (a,b,c) VALUES ('HELLO' ,'you', 'are')
在上面的代码中应该如何做呢,就是v_Values在java中应该如何赋值呢。
...全文
943 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rwq_ 2002-03-24
create or replace procedure sys.proInsertCustInfo2(
v_Names in VARCHAR2,
v_Values in VARCHAR2) IS
v_Cursor NUMBER;
v_CreateString VARCHAR2(500);
vID number;
v_id number;
v_number number;
begin
DBMS_OUTPUT.PUT_LINE('aaaa');
v_Cursor := DBMS_SQL.OPEN_CURSOR;
select sa.custom_id_seq.nextval into v_id from dual;

v_CreateString := 'INSERT INTO sa.CSCUSTOM( CUSTID, CUSTSTATDATE, '||v_Names ||')'||'VALUES('||to_char(v_id)||',sysdate, ''' || replace(v_Values,',',''',''') || ''')';

DBMS_SQL.PARSE(v_Cursor, v_CreateString, DBMS_SQL.V7);
v_number:=DBMS_SQL.EXECUTE(v_Cursor);
DBMS_SQL.CLOSE_CURSOR(v_Cursor);
commit work;
end proInsertCustInfo2;

----------
exec PROINSERTCUSTINFO2('custstr,custstr2','bb,cc');


可以了!
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-24
谢谢大家,我下午加班,试一下,可以马上送分
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-24
谢谢 rwq_(风云浪子),真是解燃眉之急,明天就要给老板演示了,给分,另外请到
http://www.csdn.net/expert/topic/594/594846.xml?temp=.218075
回复一下,我好送分。
  • 打赏
  • 举报
回复
hqskoala 2002-03-23
这里不用使dbms_sql包
这样试试
execute immediate 'INSERT INTO CSCUSTOM ( CUSTID, CUSTSTATDATE,:1)VALUES (:2,:3,:4)' using v_Names , custom_id_seq.nextval,sysdate, v_Values ;
  • 打赏
  • 举报
回复
rwq_ 2002-03-23
我明白你的意思了!让我改一下!
  • 打赏
  • 举报
回复
rwq_ 2002-03-23
我在,假如我想传两个字段怎么传?
你可以这样来考虑:这个自增字段通过触发器来完成!这样你就不用考虑在这个过程中完成了!
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-23
现在有人在吗?
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-23
当然可以了,你看一下上面存储过程的代码,v_Names就是传进来的字段名序列,v_Values就是值序列,
你说的将整个语句在java中生成我想过,但是里面有自增字段,如果在java里面生成的话,就需要从oracle中获得custom_id_seq.nextval,这个值该如何读取(我在oracle中用 vID := custom_id_seq.nextval 出错)
  • 打赏
  • 举报
回复
rwq_ 2002-03-23
如果你的字段不定的话,你怎么传参数进来?你现在定义参数表最多是只能是一个字段啊!
这样试试:
把整个SQL语句作为一个参数传进来!
再用DBMS_SQL来执行!
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-23
总之,情况时这样的,我的程序是jsp,首先从数据库的一个表中获得需要插入值得字段,然后生成一个用户输入的页面,将用户的输入提交到另外一个jsp中作处理,在这个页面中jsp程序获得提交的数据,生成字符串,然后提交到存储过程。
  • 打赏
  • 举报
回复
TechnoFantasy 2002-03-23
用bind好像不可以,因为我需要插入的字段数是不定的,就是这次有3个字段要插入,另外一次是4个字段,所以字段名和值要一次传入。
  • 打赏
  • 举报
回复
leio 2002-03-23
楼上代码中还应在CURSOR关闭前加上一句:
dbms_sql.execute(v_Cursor);

  • 打赏
  • 举报
回复
rwq_ 2002-03-23
CREATE or replace procedure proInsertCustInfo(
v_Names in VARCHAR2,
v_Values in VARCHAR2) IS
v_Cursor NUMBER;
v_CreateString VARCHAR2(500);
vID number;
v_id number;
begin
v_Cursor := DBMS_SQL.OPEN_CURSOR;
select custom_id_seq.nextval into v_id from dual;

v_CreateString := 'INSERT INTO CSCUSTOM ( CUSTID, CUSTSTATDATE, ' || v_Names || ') VALUES (:MID, :DT, :VALUE)';

DBMS_SQL.PARSE(v_Cursor, v_CreateString, DBMS_SQL.V7);
DBMS_SQL.BIND_VARIABLE(V_Cursor,':MID',v_id);
DBMS_SQL.BIND_VARIABLE(v_Cursor,':DT',sysdate);
DBMs_SQL.Bind_Variable(v_Cursor,':VALUE',v_values);

DBMS_SQL.CLOSE_CURSOR(v_Cursor);

commit work;
end proInsertCustInfo;
------
我改了一下!
  • 打赏
  • 举报
回复
rabbit 2002-03-23
同意hqskoala(大晟)所说。
  • 打赏
  • 举报
回复
相关推荐
发帖
Sybase
加入

2589

社区成员

Sybase相关技术讨论区
社区管理员
  • Sybase社区
申请成为版主
帖子事件
创建了帖子
2002-03-23 12:18
社区公告
暂无公告