【问题标题】:how to call a nested procedure thru jdbc如何通过 jdbc 调用嵌套过程
【发布时间】:2013-07-25 00:41:27
【问题描述】:

请告诉我如何使用可调用语句通过 JDBC 调用嵌套过程。我想将(1 个字符串和 1 个整数)存储到运行时创建的表中。

create or replace procedure mytable (
Ptable_name in varchar2
, Pemp_name in varchar2
, Pemp_age in number
 ) is

 procedure myvalues (
   Pemp_name in varchar2
 , Pemp_age in number
   ) is
begin
 execute immediate 'insert into ' || Ptable_name
                || ' values (:emp_name, :emp_age)'
      using Pemp_name, Pemp_age;
end;

begin
execute immediate 'create table ' || Ptable_name
                  || ' (sname varchar2(20), sage number (4))';

myvalues ( Pemp_name, Pemp_age);
end;

【问题讨论】:

  • 为什么要在运行时创建表?调用嵌套过程是什么意思?您想直接调用myvalues,而不是调用mytable 并调用私有内部插入过程?或者您只是想知道如何拨打mytable?无论哪种方式,您都尝试过什么?
  • “它不起作用”不是错误消息,也不能帮助我们帮助您。请将您的 Java 代码以及错误和堆栈跟踪添加到问题中,以便我们查看您做错了什么。
  • 我尝试使用可调用语句通过 (begin mytable(+tablename+,+username+,+age+); end; ) 调用 mytable,但它不起作用。我正确地引用了变量?
  • ok.. 这是 java 代码 public class loginuser { public String tablename;公共字符串用户名;公共整数年龄;公共字符串执行(){连接CON;语句 stmt;尝试 { Class.forName("oracle.jdbc.driver.OracleDriver"); con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","Gaurav","oracle"); stmt=con.createStatement(); callablestatement cs=con.preparecall("HOW TO CALL A PROCEDURE ?");

标签: oracle jdbc oracle10g


【解决方案1】:

工作演示:

SQL> create or replace procedure mytable (
Ptable_name in varchar2
, Pemp_name in varchar2
, Pemp_age in number
 ) is

 procedure myvalues (
   Pemp_name in varchar2
 , Pemp_age in number
   ) is
begin
 execute immediate 'insert into ' || Ptable_name
                || ' values (:emp_name, :emp_age)'
      using Pemp_name, Pemp_age;
end;

begin
execute immediate 'create table ' || Ptable_name
                  || ' (sname varchar2(20), sage number (4))';

myvalues ( Pemp_name, Pemp_age);
end;
/  

Procedure created.

SQL> select table_name from user_tables
where table_name = 'PTABLE';   

no rows selected

Java 程序

    Connection con;
    OracleDataSource ods = new OracleDataSource();
    ods.setURL("jdbc:oracle:thin:c##test/test@192.168.1.200:1521:orcl");
    con=ods.getConnection(); 
    CallableStatement cs =con.prepareCall("begin mytable( ?, ?, ? ); end;");
    cs.setString(1, "ptable");
    cs.setString(2, "pname");
    cs.setInt(3, 1);
    cs.executeUpdate();
    cs.close();
    con.close();

和结果:

SQL> select table_name from user_tables
where table_name = 'PTABLE';   

TABLE_NAME
-------------
PTABLE

SQL> insert into ptable values( 'a', 22 );

1 row created.
SQL> select * from ptable;

SNAME                SAGE
-------------------- ----------
a                    22
pname                 1

【讨论】:

  • 感谢您的信息,但是我想知道的是,如果我从一个 jsp 页面获取用户输入,用户将在其中输入他的姓名(表格将由该名称创建)以及他的年龄和用户名(将保存在该表中)然后我将如何在可调用语句中引用名称、年龄、用户名(开始 mytable (?,?,?); end;)
  • 在可调用语句中引用名称等到底是什么意思?对该过程的调用与任何其他过程调用一样,您将参数传递给它(从代码中的变量或常量 - 您的代码在将它们传递给调用之前必须知道它们)然后调用它。请解释一下您要做什么?是否意味着您要将表中的值读回应用程序中?
  • 我应该如何在 (begin mytable (?,?,?); end;) 中引用 (name, age, username)
  • 你使用 callable statament 和 setXXX 函数来引用它们。 begin mytable( ?, ?, ? ); end; 有三个位置参数 - 三个? ? ? (第一,第二和第三)。对cs.setString(1, "ptable"); 的调用将值“ptable”分配给第一个? (第一个参数)在调用 oracle 过程中(在 begin ... end 内)。对cs.setString(2, "pname"); 的调用将值“pname”分配给第二个参数,并将cs.setInt(3, 1); - 值1 分配给第三个参数。最后,cs.executeUpdate(); 使用这三个参数执行该过程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 2012-01-05
  • 1970-01-01
  • 2020-09-18
  • 2016-01-08
  • 2015-05-28
相关资源
最近更新 更多