本人用java开发,连接oracle8i的代码如下:
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
String strUrl = "jdbc:oracle:thin:@192.168.1.114:1521:sid";
Connection conn =  DriverManager.getConnection(strUrl,"username","password");
知道有n多的方法可以得到新插入行的ROWID,例如:
**方法1,将以下4行保存到(如d:/a.sql)文件:
VARIABLE r varchar2(18);
insert into tablename(fld1,fld2) values(val1,val2) returning rowidtochar(rowid) into :r;
commit;
select :r from dual;
在服务端sqlplus下执行"@d:/a.sql;",可以由“SQL>”符下得到ROWID,这可以通过在服务端的java程序里使用InputStreamReader得到输出结果。
**方法2,将以下7行保存到(如d:/b.sql)文件:
set serveroutput on size 100000;
declare c varchar2(200);
begin
insert into tablename(fld1,fld2) values(val1,val2) return rowid into c;
dbms_output.put_line('rowid='||c);
end;
/
在服务端sqlplus下执行"@d:/b.sql;",也可以由“SQL>”符下得到ROWID。
方法1在客户端java程序里用Connection.prepareCall("<sql脚本组成的字符串>")就出错,主要因为声明了VARIABLE变量。
方法1在客户端java程序里用Connection.prepareCall("<sql脚本组成的字符串>")也出错,因为使用了set...on,去掉set...on这行运行可以,但不知道变量c怎样能转换到程序变量里来?
方法3,在服务端写存储过程,如:
CREATE OR REPLACE PROCEDURE SYSTEM.GETINSERTROWID (insertSql in VARCHAR2,r out VARCHAR2)
AS
BEGIN
  execute immediate insertSql returning rowid into r;
END;
这个存储过程在java下调用时总出问题,暂不理会。本人最想实现的是,在客户端java程序里使用thin连接,调用OracleCallableStatement或Statment直接执行几行拼好的字符串(而不是sql脚本或调用服务端存储过程)后直接返回这个ROWID,本人想这样使用的理由是:
1.不想在客户端安装任何oracle客户端程序或安装程序,用thin连接即可
2.因为1的原因,客户端java程序里不能使用诸如Runtime.getRuntime().exec("sql")的方法
3.不想使用在服务端建立存储过程然后在客户端调用存储过程的方法
4.不想将sql语句提交到服务端使用sqlplus来执行
5.实现执行动态sql,因为业务需要,这样的insert变化多样请oracle高手们指点!!分不够再加。

解决方案 »

  1.   

    你的语句是字符串把,根据关键字(table,values等)还有括号把你原来的语句可以改为一个
    select rowid form yourtable where col1 = data1 and col2 = tada2....;在执行之。
    或者你的表没主键直接select max(rowid) from table就行,主要你这也不行那也不行……
      

  2.   

    楼上没有看清我的意思吧?
    本人最想实现的是,在客户端java程序里使用thin连接,以字符串为传入参数调用连接对象(Connection)或OracleCallableStatement或Statment或其他对象的某个函数后能便捷地返回这个ROWID。这个字符串必须包含插入新行的sql语句。不模拟sqlplus命令行的调用方式、不调用存储过程的方式、不使用脚本的方式。
    或者这样,如前所述,使用方法2:在客户端java程序里用Connection.prepareCall(" <sql脚本组成的字符串 >")(注意要去掉set...on这行),但不知道变量c怎样能转换到程序变量里来? 解决这个也就可以了!!
    [勘误:原帖中第二句“方法1在客户端java程序里...”中“方法1”应为“方法2”]
      

  3.   

    楼上没有看清我的意思吧?
    本人最想实现的是,在客户端java程序里使用thin连接,以字符串为传入参数调用连接对象(Connection)或OracleCallableStatement或Statment或其他对象的某个函数后能便捷地返回这个ROWID。这个字符串必须包含插入新行的sql语句。不模拟sqlplus命令行的调用方式、不调用存储过程的方式、不使用脚本的方式。
    或者这样,如前所述,使用方法2:在客户端java程序里用Connection.prepareCall(" <sql脚本组成的字符串 >")(注意要去掉set...on这行),但不知道变量c怎样能转换到程序变量里来? 解决这个也就可以了!!
    [勘误:原帖中第二句“方法1在客户端java程序里...”中“方法1”应为“方法2”]
      

  4.   

    你的问题似乎和ORACLE无关而和JAVA有关。
    可以试一下下面的代码; String sql = "insert into tablename(fld1,fld2) values(val1,val2);select rowid from tablename where fld1=val1 and fld2=val2;";
    if (stat.execute(sql)) {
           stat.getMoreResultSet();
           ResultSet aRst = stat.getResultSet();
           aRst.next(); 
           String rowid = aRst.getString(1);
            ......      
      

  5.   

    不安装任何oracle驱动的客户端程序? 它怎么连接数据库?