ITPUB??ì3
ITPUB论坛 » Oracle开发 » 关于动态sql问题

标题: 关于动态sql问题
离线 Arraysunbird
老会员


精华贴数 0
个人空间 0
技术积分 1996 (830)
社区积分 137 (3014)
注册日期 2001-10-12
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2002-1-28 13:25 
关于动态sql问题

create or replace procedure  com_test(v_je_source in varchar2)
is
v_cursorid integer;
v_createstring varchar2(4000);
begin
v_createstring :='create or replace view test(je_source) as select
:je_source from dual';
v_cursorid:=dbms_sql.open_cursor;
dbms_sql.parse(v_cursorid,v_createstring,dbms_sql.native);
dbms_sql.bind_variable(v_cursorid,':je_source',v_je_source);
dbms_sql.close_cursor(v_cursorid);
end com_test;

我的意思显而易见就是说我建立的视图要依照我的参数的不同而不同,所以我采用的绑定v_je_source 我的意思无非是说
我这样调用com_test('aaa')
那末我视图的脚本是create or replace view  test(je_source) as
select 'aaa' from dual;
当然了比较简单不过我就是想实现这个功能怎样去做



只看该作者    顶部
离线 jmniu
中级会员


精华贴数 3
个人空间 0
技术积分 1183 (1543)
社区积分 55 (4763)
注册日期 2001-12-31
论坛徽章:2
ITPUB元老授权会员    
      

发表于 2002-1-28 13:57 
re:

一个小建议,在8i中不必再用dbms_sql.open_cursor; dbms_sql.parse;dbms_sql.bind_variable;
dbms_sql.close_cursor; 你只要完成了DDL,DML的statement, 就可以用EXECUTE IMMEDIATE。
一个简单的例子:
CREATE OR REPLACE PROCEDURE Create_Customer
(Table_Name VARCHAR2,
Customer_ID INTEGER,
Customer_Lastname VARCHAR2,
Customer_Firstname VARCHAR2,
) IS

cSQL_Statement VARCHAR2(200);

BEGIN
   cSQL_Statement := 'INSERT INTO ' ||TRIM(Table_Name)||
      ' VALUES(:Id, :Last, :First)';

   EXECUTE IMMEDIATE cSQL_Statement
      USING Customer_ID, Customer_Lastname;

EXCEPTION
   
   WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20101,
         'Error in procedure Create_Customer.');

END Create_Customer;


__________________
有感即通,千江有水千江月; 无机不被,万里无云万里天。
只看该作者    顶部
离线 sunbird
老会员


精华贴数 0
个人空间 0
技术积分 1996 (830)
社区积分 137 (3014)
注册日期 2001-10-12
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2002-1-28 14:11 
我的是8.05我也想用你的方法 又快又简单可是数据库不支持

谢谢!!!!!!!!!!!!!!!!!!!!!!!!


只看该作者    顶部
离线 cnnbull
中级会员



精华贴数 0
个人空间 0
技术积分 302 (6652)
社区积分 2 (23486)
注册日期 2001-11-22
论坛徽章:1
授权会员     
      

发表于 2002-1-29 04:25 
Re: re:



QUOTE:
最初由 jmniu 发布
一个小建议,在8i中不必再用dbms_sql.open_cursor; dbms_sql.parse;dbms_sql.bind_variable;
dbms_sql.close_cursor; 你只要完成了DDL,DML的statement, 就可以用EXECUTE IMMEDIATE。
一个简单的例子:
CREATE OR REPLACE PROCEDURE Create_Customer
(Table_Name VARCHAR2,
Customer_ID INTEGER,
Customer_Lastname VARCHAR2,
Customer_Firstname VARCHAR2,
) IS

cSQL_Statement VARCHAR2(200);

BEGIN
   cSQL_Statement := 'INSERT INTO ' ||TRIM(Table_Name)||
      ' VALUES(:Id, :Last, :First)';

   EXECUTE IMMEDIATE cSQL_Statement
      USING Customer_ID, Customer_Lastname;

EXCEPTION
   
   WHEN OTHERS THEN
      RAISE_APPLICATION_ERROR(-20101,
         'Error in procedure Create_Customer.');

END Create_Customer;


这种情况不适于EXTERNAL APPLICATION'S PROCEDUAL CALL


只看该作者    顶部
离线 cnnbull
中级会员



精华贴数 0
个人空间 0
技术积分 302 (6652)
社区积分 2 (23486)
注册日期 2001-11-22
论坛徽章:1
授权会员     
      

发表于 2002-1-29 05:23 
Re: 关于动态sql问题



QUOTE:
最初由 sunbird 发布
create or replace procedure  com_test(v_je_source in varchar2)
is
v_cursorid integer;
v_createstring varchar2(4000);
begin
v_createstring :='create or replace view test(je_source) as select
:je_source from dual';
v_cursorid:=dbms_sql.open_cursor;
dbms_sql.parse(v_cursorid,v_createstring,dbms_sql.native);
dbms_sql.bind_variable(v_cursorid,':je_source',v_je_source);
dbms_sql.close_cursor(v_cursorid);
end com_test;

我的意思显而易见就是说我建立的视图要依照我的参数的不同而不同,所以我采用的绑定v_je_source 我的意思无非是说
我这样调用com_test('aaa')
那末我视图的脚本是create or replace view  test(je_source) as
select 'aaa' from dual;
当然了比较简单不过我就是想实现这个功能怎样去做


将v_createstring :='create or replace view test(je_source) as select
:je_source from dual';
改为
v_createstring :='create or replace view test(je_source) as select
'''||v_je_source||''' from dual';
去掉dbms_sql.bind_variable(v_cursorid,':je_source',v_je_source);
就行了.


只看该作者    顶部
离线 sunbird
老会员


精华贴数 0
个人空间 0
技术积分 1996 (830)
社区积分 137 (3014)
注册日期 2001-10-12
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2002-1-31 21:25 
Re: Re: 关于动态sql问题



QUOTE:
最初由 cnnbull 发布

将v_createstring :='create or replace view test(je_source) as select
:je_source from dual';
改为
v_createstring :='create or replace view test(je_source) as select
'''||v_je_source||''' from dual';
去掉dbms_sql.bind_variable(v_cursorid,':je_source',v_je_source);
就行了.


确实 原来ddl还不能用绑定变量


只看该作者    顶部
 
    

相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问