用第二种格式的动态SQL语句创建的游标,如何关闭?

来源:互联网 发布:java调用存储函数 编辑:程序博客网 时间:2024/05/31 11:03
我要发贴 贴吧注册   
  搜索本站
注册IT贴吧 It贴吧 首页 | Web | Java | VC/MFC | VB | Delphi | C/C++ | C++ Builder | 其他开发语言 | .NET技术 | 移动平台 | MS-SQL Server | PowerBuilder | DB2 Oracle | 其他数据库开发 | Linux/Unix社区 | 多媒体/设计 | 硬件/嵌入开发 | Windows专区 | 硬件使用 | 扩充话题 | 专题开发 | 软件培训/认证/考试
<script type="text/javascript"><!--google_ad_client = "pub-6429085586750275";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";//2006-11-21: post1google_ad_channel = "8267768031";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "0000FF";google_color_text = "000000";google_color_url = "008000";//--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6429085586750275&amp;dt=1164833598203&amp;lmt=1164833598&amp;format=728x90_as&amp;output=html&amp;channel=8267768031&amp;url=http%3A%2F%2Fdev.cbw.com%2Fpb%2Fbclass%2F20058105801_5F4088930.shtml&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=0000FF&amp;color_url=008000&amp;color_border=FFFFFF&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26q%3Dcursor%2B%25E3%2580%2580%25E3%2580%2580DECLARE%2BCURSOR%26lr%3D&amp;cc=533&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480" frameborder="0" width="728" scrolling="no" height="90" allowtransparency="allowtransparency"></iframe>
<script type="text/javascript"><!--google_ad_client = "pub-6429085586750275";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";//2006-11-21: post2google_ad_channel = "9809716554";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "0000FF";google_color_text = "000000";google_color_url = "008000";//--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6429085586750275&amp;dt=1164833598265&amp;lmt=1164833598&amp;prev_fmts=728x90_as&amp;format=728x90_as&amp;output=html&amp;channel=9809716554&amp;url=http%3A%2F%2Fdev.cbw.com%2Fpb%2Fbclass%2F20058105801_5F4088930.shtml&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=0000FF&amp;color_url=008000&amp;color_border=FFFFFF&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26q%3Dcursor%2B%25E3%2580%2580%25E3%2580%2580DECLARE%2BCURSOR%26lr%3D&amp;cc=533&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480" frameborder="0" width="728" scrolling="no" height="90" allowtransparency="allowtransparency"></iframe>
    基础类 非技术版 Pb脚本语言 DataWindow API 调用 控件与界面 Pb Web 应用 数据库相关 项目管理   用第二种格式的动态SQL语句创建的游标,如何关闭?
如下方式应用的游标,如何关闭?

prepare sqlsa from "delete from pdc_order_excute where orderid=?" using ta_librarian_writer;

execute sqlsa using :s_orderid;
      yeqiufeng(叶秋枫) 于 2005-6-17 12:53:50
您这……叫游标么
    sywen(古道西风) 于 2005-6-17 13:26:35
這個只是動態sql語句,不需要關閉!
    j9dai(DoItNow) 于 2005-6-17 13:45:43
再认真看一遍四种动态SQL
    j9dai(DoItNow) 于 2005-6-17 13:49:38
动态SQL四种类型的语句格式

1.Dynamic SQL Format 1

EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ;

eg:
string Mysql
Mysql = "CREATE TABLE Employee "&
+"(emp_id integer not null,"&
+"dept_id integer not null, "&
+"emp_fname char(10) not null, "&
+"emp_lname char(20) not null)"
EXECUTE IMMEDIATE :Mysql ;

2.Dynamic SQL Format 2

PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
EXECUTE DynamicStagingArea USING {ParameterList} ;

eg:
INT Emp_id_var = 56
PREPARE SQLSA
FROM "DELETE FROM employee WHERE emp_id=?" ;
EXECUTE SQLSA USING :Emp_id_var ;


3.Dynamic SQL Format 3

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
OPEN DYNAMIC Cursor {USING ParameterList} ;
EXECUTE DYNAMIC Procedure {USING ParameterList} ;
FETCH Cursor | Procedure INTO HostVariableList ;
CLOSE Cursor | Procedure ;
eg:
integer Emp_id_var

DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
PREPARE SQLSA FROM "SELECT emp_id FROM employee" ;
OPEN DYNAMIC my_cursor ;
FETCH my_cursor INTO :Emp_id_var ;
CLOSE my_cursor ;


4.Dynamic SQL Format 4

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;
PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ;
DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ;
OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ;
CLOSE Cursor | Procedure ;

eg:

string Stringvar, Sqlstatement
integer Intvar
Sqlstatement = "SELECT emp_id FROM employee"
PREPARE SQLSA FROM :Sqlstatement ;
DESCRIBE SQLSA INTO SQLDA ;
DECLARE my_cursor DYNAMIC CURSOR FOR SQLSA ;
OPEN DYNAMIC my_cursor USING DESCRIPTOR SQLDA ;
FETCH my_cursor USING DESCRIPTOR SQLDA ;

// If the FETCH is successful, the output
// descriptor array will contain returned
// values from the first row of the result set.
// SQLDA.NumOutputs contains the number of
// output descriptors.
// The SQLDA.OutParmType array will contain
// NumOutput entries and each entry will contain
// an value of the enumerated data type ParmType
// (such as TypeInteger!, or TypeString!).

CHOOSE CASE SQLDA.OutParmType[1]
CASE TypeString!
Stringvar = GetDynamicString(SQLDA, 1)
CASE TypeInteger!
Intvar = GetDynamicNumber(SQLDA, 1)

END CHOOSE
CLOSE my_cursor ;

    balloonman2002(Blog.csdn.net/balloonman2002 - 抵制日货) 于 2005-6-17 13:50:51
同上,第二种格式不需要关闭,只有用到DECLARE语句的地方才需要对应CLOSE,否则不需要,直接执行即可,最多根据需要加上COMMIT; ROLLBACK;

DECLARE的情况如:

DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ;

CLOSE Cursor | Procedure ;
    lovemoreh(爱比恨多) 于 2005-6-17 14:18:39
感谢各位回答!

我在用了上述语句后,保持界面不关闭。然后再在其他界面对相同表进行操作时,总是阻塞。

而一旦关闭上述语句所在界面后,再在其他界面对相同表进行操作时,一切正常。

我以为是没有将事务关闭的原因。到底是什么原因呢?

多谢各位回答,问题解决后,马上结贴。
    sarya(开心) 于 2005-6-17 14:24:05
再執行commit,試一試
    lovemoreh(爱比恨多) 于 2005-6-17 14:37:17
刚才分情况加了commit和rollback语句,在测试,可能原因在这里。
<script type="text/javascript"><!--google_ad_client = "pub-6429085586750275";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";//2006-11-21: post3google_ad_channel = "8582938198";google_color_border = "FFFFFF";google_color_bg = "FFFFFF";google_color_link = "FF0000";google_color_text = "000000";google_color_url = "008000";//--></script> <script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script> <iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-6429085586750275&amp;dt=1164833598343&amp;lmt=1164833598&amp;prev_fmts=728x90_as%2C728x90_as&amp;format=728x90_as&amp;output=html&amp;channel=8582938198&amp;url=http%3A%2F%2Fdev.cbw.com%2Fpb%2Fbclass%2F20058105801_5F4088930.shtml&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=FF0000&amp;color_url=008000&amp;color_border=FFFFFF&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.google.com%2Fsearch%3Fhl%3Dzh-CN%26newwindow%3D1%26q%3Dcursor%2B%25E3%2580%2580%25E3%2580%2580DECLARE%2BCURSOR%26lr%3D&amp;cc=101&amp;u_h=800&amp;u_w=1280&amp;u_ah=772&amp;u_aw=1280&amp;u_cd=32&amp;u_tz=480" frameborder="0" width="728" scrolling="no" height="90" allowtransparency="allowtransparency"></iframe>

 

 

oracle cursor 游标

 

游标:

用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。


分类:

静态游标:
分为显式游标和隐式游标。

REF游标:
是一种引用类型,类似于指针。

 

显式游标:

 CURSOR 游标名 ( 参数 ) [返回值类型] IS
  Select 语句


生命周期:

1.打开游标(OPEN)
解析,绑定。。。不会从数据库检索数据

2.从游标中获取记录(FETCH INTO)
执行查询,返回结果集。通常定义局域变量作为从游标获取数据的缓冲区。

3.关闭游标(CLOSE)
完成游标处理,用户不能从游标中获取行。还可以重新打开。


选项:参数和返回类型


set serveroutput on
declare
 cursor emp_cur ( p_deptid in number) is
select * from employees where department_id = p_deptid;

l_emp employees%rowtype;
begin
 dbms_output.put_line('Getting employees from department 30');
open emp_cur(30);
 loop
  fetch emp_cur into l_emp;
  exit when emp_cur%notfound;
  dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
  dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
 end loop;
 close emp_cur;

 dbms_output.put_line('Getting employees from department 90');
open emp_cur(90);
 loop
  fetch emp_cur into l_emp;
  exit when emp_cur%notfound;
  dbms_output.put_line('Employee id '|| l_emp.employee_id || ' is ');
  dbms_output.put_line(l_emp.first_name || ' ' || l_emp.last_name);
 end loop;
 close emp_cur;
end;
/

 

隐式游标:

不用明确建立游标变量,分两种:
1.在PL/SQL中使用DML语言,使用ORACLE提供的名为SQL的隐示游标
2.CURSOR FOR LOOP,用于for loop 语句


1举例:

declare
begin
 update departments set department_name=department_name;
 --where 1=2;
 
 dbms_output.put_line('update '|| sql%rowcount ||' records');
end;
/


2举例:

declare
begin
 for my_dept_rec in ( select department_name, department_id from departments)
 loop
  dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name);
 end loop;
end;
/


3举例:

单独select

declare
 l_empno emp.EMPLOYEE_ID%type;
-- l_ename emp.ename%type;
begin
 select EMPLOYEE_ID   
  into l_empno
 from emp;
 --where rownum =1;
 dbms_output.put_line(l_empno);
end;
/
使用INTO获取值,只能返回一行。

 

游标属性:

%FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。
%NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
%ROWCOUNT:当前时刻已经从游标中获取的记录数量。
%ISOPEN:是否打开。


Declare
 Cursor emps is
 Select * from employees where rownum<6 order by 1;
 
 Emp employees%rowtype;
 Row number :=1;
Begin
 Open emps;
 Fetch emps into emp;
 
 Loop
  If emps%found then
   Dbms_output.put_line('Looping over record '||row|| ' of ' || emps%rowcount);
   Fetch emps into emp;
   Row := row + 1;
  Elsif emps%notfound then
   Exit;  ---exit loop, not IF
  End if;
 End loop;
 
 If emps%isopen then
  Close emps;
 End if;
End;
/

 

显式和隐式游标的区别:

尽量使用隐式游标,避免编写附加的游标控制代码(声明,打开,获取,关闭),也不需要声明变量来保存从游标中获取的数据。

 

REF CURSOR游标:

动态游标,在运行的时候才能确定游标使用的查询。分类:
强类型(限制)REF CURSOR,规定返回类型
弱类型(非限制)REF CURSOR,不规定返回类型,可以获取任何结果集。


TYPE ref_cursor_name IS REF CURSOR [RETURN return_type]


Declare
 Type refcur_t is ref cursor;
 
 Type emp_refcur_t is ref cursor return employee%rowtype;
Begin
 Null;
End;
/


强类型举例:

declare
 --声明记录类型
 type emp_job_rec is record(
  employee_id number,
  employee_name varchar2(50),
  job_title varchar2(30)
 );
 --声明REF CURSOR,返回值为该记录类型
 type emp_job_refcur_type is ref cursor
  return emp_job_rec;
 --定义REF CURSOR游标的变量
 emp_refcur emp_job_refcur_type;

 emp_job emp_job_rec;
begin
 open emp_refcur for
  select e.employee_id,
    e.first_name || ' ' ||e.last_name "employee_name",
    j.job_title
  from employees e, jobs j
  where e.job_id = j.job_id and rownum < 11 order by 1;

 fetch emp_refcur into emp_job;
 while emp_refcur%found loop
  dbms_output.put_line(emp_job.employee_name || '''s job is ');
  dbms_output.put_line(emp_job.job_title);
  fetch emp_refcur into emp_job;
 end loop;
end;

原创粉丝点击