在 Oracle 10g 中创建嵌套过程
Posted
技术标签:
【中文标题】在 Oracle 10g 中创建嵌套过程【英文标题】:Create nested procedure in Oracle 10g 【发布时间】:2013-07-23 07:07:21 【问题描述】:我想创建一个嵌套过程,在第一个过程中,我想动态创建一个包含 2 列的表,在第二个过程中,我想将值插入到该表中。
以下是我尝试使用的代码;我做错了什么?
CREATE or replace PROCEDURE mytable (tname varchar2)
is
stmt varchar2(1000);
begin
stmt := 'CREATE TABLE '||tname || '(sname varchar2(20) ,sage number (4))';
execute immediate stmt;
end;
create PROCEDURE mytable1 (emp_name varchar2,emp_age number,tname varchar2)
is
stmt1 varchar2(1000);
begin
stmt1 := 'insert into '||tname||' values ('Gaurav' ,27)';
execute immediate stmt1;
end;
【问题讨论】:
【参考方案1】:这里不需要创建嵌套过程。您可以在一个过程中完成所有操作。
注意我在execute immediate
statement中使用的绑定变量
create or replace procedure mytable (
Ptable_name in varchar2
, Pemp_name in varchar2
, Pemp_age in number
) is
begin
execute immediate 'create table ' || Ptable_name
|| ' (sname varchar2(20), sage number (4))';
execute immediate 'insert into ' || Ptable_name
|| ' values (:emp_name, :emp_age)'
using Pemp_name, Pemp_age;
end;
更一般地说,根本不需要使用execute immediate
;动态创建表表明数据库设计不佳。如果可能的话,不要这样做;提前创建表格,并有一个简单的过程来插入数据,如果你需要的话:
create or replace procedure mytable (
, Pemp_name in varchar2
, Pemp_age in number
) is
begin
insert into my_table
values (Pemp_name, Pemp_age);
end;
我强烈建议阅读 Oracle 关于 Guarding Against SQL Injection 的章节。
如果您真的觉得自己必须将其作为一个嵌套过程来执行,那么它看起来像这样;不要忘记在 main 中调用嵌套过程,因为嵌套过程在第一个范围之外是不可见的。
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;
请参阅 Oracle 在 PL/SQL subprograms 上的文档
【讨论】:
您能否告诉我在从 jdbc 代码调用上述过程时如何输入值。公共字符串名称;公共字符串用户名公共整数年龄;公共字符串执行()连接con;语句 stmt;结果集rs; Class.forName("oracle.jdbc.driver.OracleDriver"); con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","Gaurav","oracle"); stmt=con.createStatement(); CallableStatement cs = con.prepareCall (begin mytable(....); end; ); 很抱歉,自从我使用 JDBC 以来已经有一段时间了,目前我没有什么可以测试它...关于解析参数的语句中还有其他问题Stack Overflow 不过。以上是关于在 Oracle 10g 中创建嵌套过程的主要内容,如果未能解决你的问题,请参考以下文章