oracle存储过程中动态SQL Insert Into 的问题

TechnoFantasy 2002-03-23 12:16:51
对于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中应该如何赋值呢。
...全文
855 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
alexqi2008 2002-03-24
  • 打赏
  • 举报
回复
要好好学习一下.....
rwq_ 2002-03-24
  • 打赏
  • 举报
回复
http://www.csdn.net/expert/topic/594/594847.xml?temp=1.662844E-02
我写了答案!
mycode 2002-03-24
  • 打赏
  • 举报
回复
你的语句中,缺少了
DBMS_SQL.execute(v_CreateString);
也就没有是执行插入操作。
所以数据是没有办法插入的。
hqskoala 2002-03-23
  • 打赏
  • 举报
回复
INSERT INTO TBNAME (VARC1,VARC2) VALUES ('s1', 's2')
对应
v1:= 's1' ;
v2:= 's2' ;
execute immediate 'INSERT INTO TBNAME (VARC1,VARC2) VALUES (:1, :2)' using v_1,v_2 ;
TechnoFantasy 2002-03-23
  • 打赏
  • 举报
回复
总之,情况时这样的,我的程序是jsp,首先从数据库的一个表中获得需要插入值得字段,然后生成一个用户输入的页面,将用户的输入提交到另外一个jsp中作处理,在这个页面中jsp程序获得提交的数据,生成字符串,然后提交到存储过程。
TechnoFantasy 2002-03-23
  • 打赏
  • 举报
回复
用bind好像不可以,因为我需要插入的字段数是不定的,就是这次有3个字段要插入,另外一次是4个字段,所以字段名和值要一次传入。
leio 2002-03-23
  • 打赏
  • 举报
回复
变量需要先bind。
改写如下,试试看
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.bind_variable(c_Cursor,':v_Values',v_Values);

DBMS_SQL.execute(v_CreateString);

DBMS_SQL.CLOSE_CURSOR(v_Cursor);

commit work;
end proInsertCustInfo;

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧