PL/SQL:open for [using] 语句

2017年07月19日 09:52:55 学孩儿无牙哭做粥 阅读数:681 标签: oracleSQLPLSQL 更多

个人分类: ORACLESQL/PLSQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/crzzyracing/article/details/75336196


※ OPEN FOR [USING] 语句 ※


目的:

和ref cursor配合使用, 可以将游标变量分配给不同的SQL (而不是在declare中把游标给定死), 增加处理游标的灵活性

语法:

declare

type type_cursor  is ref cursor [return 记录类型];  --使用 ref cursor 才能把游标分配给不同的SQL,return不能用在动态SQL中

v_cursor type_cursor ;

begin

OPEN v_cursor FOR select first_name, last_name from student;

OPEN v_cursor FOR select first_name,last_name  from student where zip = :1 '

USING 绑定变量1;

open 静态SQL cursor cursor c1 is <静态SQL文本>
open c1; fetch ... into ... ; close c1;
open for     静态SQL     ref cursor type t_1 is ref cursor;
c2  t_1 ;
open c2 for <静态SQL语句>;
open for using 动态SQL type t_1 is ref cursor;
c2  t_1 ;
open c2 for <动态SQL语句> using ... ;

例子1:

declare

type student_cur_type is ref CURSOR RETURN test_stu%ROWTYPE;  --声明ref cursor类型, return类型固定

v_first_name test_stu.first_name%TYPE;

v_last_name test_stu.last_name%TYPE;

cur_stud student_cur_type;

begin

open cur_stud for select first_name,last_name from student ;  --带return的ref cursor只能用在静态sql中

loop

fetch cur_stud into v_first_name, v_last_name;

exit when cur_stud%NOTFOUND;

dbms_output.put_line(v_first_name || ' ' || v_last_name);

end loop;

close cur_stud;

end;

例子2:

declare

v_zip        varchar2(5) := '&sv_zip';

v_first_name varchar2(25);

v_last_name  varchar2(25);

type student_cur_type is ref cursor;  --声明ref cursor类型

student_cur student_cur_type;  --student_cur是游标变量 / student_cur_type 是引用游标类型

begin

--2打开游标变量,让它指向一个动态select查询的结果集 ; 就是使用open for语句代替一般的open语句代开游标

open student_cur for 'select first_name,last_name ' from student where zip = :1'

using v_zip;

loop

fetch student_cur into v_first_name, v_last_name;

exit when student_cur%NOTFOUND;

dbms_output.put_line(v_first_name || ' ' || v_last_name);

end loop;

close student_cur;

end;

https://blog.csdn.net/crzzyracing/article/details/75336196


动态SQL中使用Open for语句

2017年09月06日 19:35:55 keven2840 阅读数:3199 标签: 动态sqlopen for多行动态查询 更多

个人分类: Oracle之SQL和PLSQL

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/keven2840/article/details/77870465

Open for本是为了支持游标变量,现在用它实现多行动态查询。OPEN FOR的语法如下:

OPEN{cursor_variable | :host_cursor_viable}FOR SQL_string

[USING bind_argument [, bind_argument]…];

解释:

Cursor_variable是一种弱类型的游标变量。

:host_cursor_variable是在PL/SQL宿主环境下声明的游标变量,如Oracle调用接口程序。

SQL_string包含动态执行的SELECT语句。

USING子句与EXECUTE IMMEDIATE语句遵循相同的规则。

使用OPEN FOR语句打开动态查询的例子:

PROCEDURE show_parts_inventory(

parts_table IN VARCHAR2, where_in IN VARCHAR2)

IS

TYPE query_curtype IS REF CURSOR;

dyncur query_curtype;

BEGIN

OPEN dyncur FOR

'SELECT * FROM' || parts_table || 'WHERE' || where_in;

。。。

执行OPEN FOR语句时,PL/SQL运行引擎操作如下:

1、  将游标变量与在查询字符串找到的查询相关联。

2、  对绑定参数求值,并用这些值替换查询字符串内的占位符。

3、  执行查询。

4、  识别结果集。

5、  将游标放在结果集第一行。

6、  把由%ROWCOUNT返回的行计数值归零。

注意,查询中任何绑定参数(由USING子句提供),仅当游标变量打开时才能求值。这意味着如果我们想对相同的动态查询使用不同的绑定参数值,

就必须使用该参数再执行一次OPEN FOR语句。

执行多行查询需遵循以下步骤:

1、  声明一个REFCURSOR类型(或使用Oracle定义的SYS_REFCURSOR弱CURSOR类型)。

2、  基于这个REF CURSOR类型声明一个游标变量。

3、  用这个游标变量打开查询字符串。

4、  使用FETCH语句提供查询确认的一行或多行结果集。

5、  必要时检查游标属性(%FOUND、%NOTFOUND、%ROWCOUNT、%ISOPEN)。

6、  使用标准CLOSE语句关闭游标变量。

/*显示任何一个表中由WHERE子句所选出的行的指定列的内容(对数字、日期和字符串列有效)*/

/*参数说明:tab:表名、col:列名、whr:条件*/

PROCEDURE showcol(tab IN VARCHAR2,

col IN Varchar2,

whr IN VARCHAR2:=NULL)

IS

cv SYS_REFCURSOR;

val VARCHAR2(32767);

BEGIN

OPEN cv FOR

--注意字符串之间的空格

'SELECT ' || col ||

' FROM ' || tab ||

' WHERE ' || NVL(whr, '1 = 1');

LOOP

--取cv的值给val,如果找不到就退出,和显示游标相同

FETCH cv INTO val;

EXIT WHEN cv%NOTFOUND;

--如果取到第一行,显示头部的信息

IFcv%ROWCOUNT = 1

THEN

Dbms_Output.put_line(RPAD('_',60,'_'));

Dbms_Output.put_line(

'Contents of ' || UPPER(tab)|| '.' || UPPER(col));

Dbms_Output.put_line(RPAD('_',60,'_'));

END IF;

Dbms_Output.put_line(val);

END LOOP;

--记得关闭游标

CLOSE cv;

END;

/*升级版showcol程序,显示带有一个时间列,并且时间列在一定范围数值内的所有列的信息*/

PROCEDURE showcol(tab VARCHAR2,

col VARCHAR2,

dtcol VARCHAR2,

dt1 DATE,

dt2 DATE := NULL)

IS

cvSYS_REFCURSOR;

val VARCHAR2(32767);

BEGIN

OPEN cv FOR

--注意空格

'SELECT ' || col ||

' FROM ' || tab ||

' WHERE ' || dtcol ||

' BETWEEN TRUNC (:startdt) AND TRUNC (:enddt)'

USING dt1, NVL (dt2, dt1+1);

LOOP

--取cv的值给val,如果找不到就退出

FETCH cv INTO val;

EXIT WHEN cv%NOTFOUND;

--如果取到第一行,显示信息

IF cv%ROWCOUNT = 1

THEN

Dbms_Output.put_line(

'Contents of ' || UPPER(tab)|| '.' || UPPER(col) ||

' for ' || UPPER(dtcol) ||

' between ' || dt1 || ' AND' || NVL (dt2, dt1+1));

END IF;

Dbms_Output.put_line(val);

ENDLOOP;

CLOSE cv;

END;

https://blog.csdn.net/keven2840/article/details/77870465/

oracle中游标与动态绑定变量

一、      游标:

用数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等等。

在Oracle9i之前,使用FETCH语句每次只能提取一行数据;从Oracle9i开始,通过使用FETCH…BULK COLLECT INTO语句,每次可以提取多行数据。语法如下:

(1) FETCH cursor_name INTO variable1,variable2,…;

此方法必须要使用循环语句处理结果集的所有数据。

(2) FETCH cursor_name BULK COLLECT INTO collect1,collect2,…[LIMIT rows]

[LIMIT rows]可用来限制每次游标每次提取的行数。

游标的分类: 显式游标和隐式游标

显示游标的使用:

  1. 声明游标

CURSOR mycur(vartype number) is

select emp_no,emp_zc from cus_emp_basic

where com_no = vartype;

  1. 打开游标

open mycur(000627) 注:000627:参数

  1. 读取数据

fetch mycur into varno,varprice;

  1. 关闭游标

close mycur;

游标的属性

oracle游标有4个属性: %ISOPEN 、%FOUND 、%NOTFOUND、%ROWCOUNT

  • %ISOPEN 判断游标是否被打开,如果打开%ISOPEN 等于true,否则等于false
  • %FOUND %NOTFOUND 判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false
  • %ROWCOUNT 返回当前位置为止游标读取的记录行数。

二、      动态绑定变量

动态绑定变量解决Oracle应用程序可伸缩性的一个关键环节;而Oracle的共享池就决定了开发人员必须使用绑定变量;如果想要Oracle 运行减慢,甚至完全终止,那就可以不用绑定变量。

这里举例说明上述问题;

为了查询一个员工代号是123,你可以这样查询:

select * from emp where empno=’123’;

你也可以这样查询:

select * from emp where empno=:empno;

象我们往常一样,你查询员工’123’一次以后,有可能再也不用;接着你有可能查询员工’456’,然后查询’789’等等;如果查询使用象第一个查询语句,你每次查询都是一个新的查询(我们叫它硬编码的查询方法);因此,Oracle每次必须分析,解析,安全检查, 优化等等;

第二个查询语句提供了绑定变量:empno,它的值在查询执行时提供,查询经过一次编译后,查询方案存储在共享池中,可以用来检索和重用;在性能和伸缩性方面,这两者的差异是巨大的,甚至是惊人的;通俗点讲,就不是一个级别;

第一个查询使用的频率越高,所消耗的系统硬件资源越大,从而降低了用户的使用数量;它也会把优化好的其它查询语句从共享池中踢出;就象一个老鼠坏了一锅汤似的,系统的整体性能降低; 而执行绑定变量,提交相同对象的完全相同的查询的用户(这句话,大家听起来比较难理解,随后我会给出详细的解释),一次性使用就可重复使用,其效率不言耳语; 打个形象的比喻来说,第一个查询就象一次性使用的筷子,而第二个查询象是铁筷子,只要洗干净,张三李四都能用,合理有效地使用了资源

动态绑定与静态对比:

DECLARE

v_sql VARCHAR2(500);

BEGIN

--不使用绑定变量

/*FOR i IN 1..50000 LOOP

v_sql :='insert into t_temp values('||i||')';

EXECUTE IMMEDIATE v_sql;

END LOOP;*/

--使用绑定变量增加数据

FOR i IN 1..50000 LOOP

v_sql :='insert into t_temp values(:a)';

EXECUTE IMMEDIATE v_sql USING i;

END LOOP;

END;

--TRUNCATE TABLE t_temp;

动态查询sql举例:

--查询的动态sql

DECLARE

V_SQL    VARCHAR2(100);

V_CURSOR SYS_REFCURSOR;

V_EMP    EMP%ROWTYPE;

BEGIN

V_SQL := 'select * from emp &条件';

OPEN V_CURSOR FOR V_SQL;

LOOP

FETCH V_CURSOR INTO V_EMP;

EXIT WHEN V_CURSOR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(V_EMP.ENAME);

END LOOP;

CLOSE V_CURSOR;

END;

https://www.cnblogs.com/leafde/p/3830505.html

Oracle动态游标入门一

2008年01月12日 09:50:00 xjzdr 阅读数:18038

说明:下面的存储过程在Oracle817下全部通过测试,编译和运行均是正确的

一、最简单的一个动态游标:
CREATE OR REPLACE PROCEDURE test_cur
is
strSql1 varchar(1000);
TYPE TCUR IS REF CURSOR; 
CUR TCUR;
AC_WHERE VARCHAR2(100);
AC VARCHAR2(100); 
BEGIN
AC_WHERE := '(52228,52230)';
OPEN CUR FOR 'SELECT bill_id FROM bill_main WHERE bill_id IN '|| AC_WHERE;
LOOP
FETCH CUR INTO AC;
EXIT WHEN CUR%NOTFOUND;

DBMS_OUTPUT.PUT_LINE(AC);

END LOOP;
CLOSE CUR;
end test_cur;

二、动态游标中使用动态的SQL语句并执行:
CREATE OR REPLACE PROCEDURE test_cur
(
p_orgid_wins string
)
is
strSql1 varchar2(1000);
TYPE My_CurType IS REF CURSOR; 
CUR_1 My_CurType;--指示CUR_1的类型为My_CurType,而My_CurType是游标类型
AC_WHERE VARCHAR2(100);
AC VARCHAR2(100); 
BEGIN
AC_WHERE := '(52228,52230)';
OPEN CUR_1 FOR 'SELECT bill_id FROM bill_main WHERE bill_id IN '|| AC_WHERE;--打开动态游标
LOOP
FETCH CUR_1 INTO AC;
EXIT WHEN CUR_1%NOTFOUND;
strSql1:='delete bill_main where bill_id='||AC;
DBMS_OUTPUT.PUT_LINE(strSql1);
DBMS_OUTPUT.PUT_LINE(AC);
execute immediate strSql1;--执行一个动态的SQL语句
commit;
END LOOP;
CLOSE CUR_1;
end test_cur;

三、动态游标中执行动态DQL语句:
CREATE OR REPLACE PROCEDURE test_cur
(
p_orgid_wins string
)
is
strSql1 varchar2(1000);

strSql2 varchar2(1000);
TYPE My_CurType IS REF CURSOR; 
CUR_1 My_CurType;--指示CUR_1的类型为My_CurType,而My_CurType是游标类型
AC_WHERE VARCHAR2(100);
t_to_orgid number;
t_bill_id number; 
BEGIN
AC_WHERE := '(98978,98980)';
strSql1:='SELECT bill_id,to_orgid FROM bill_main WHERE bill_id IN '|| AC_WHERE;
DBMS_OUTPUT.PUT_LINE(strSql1);
OPEN CUR_1 FOR strSql1;--打开动态游标
LOOP
FETCH CUR_1 INTO t_bill_id,t_to_orgid;
EXIT WHEN CUR_1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('t_to_orgid='||t_to_orgid);

strSql2:='delete bill_main where bill_id='||t_bill_id;

strSql2:=strSql2|| 'and start_no='||'16506';
DBMS_OUTPUT.PUT_LINE(strSql2);
DBMS_OUTPUT.PUT_LINE(t_bill_id);
execute immediate strSql1;--执行一个动态的SQL语句
commit;
END LOOP;
CLOSE CUR_1;
end test_cur;

https://blog.csdn.net/xjzdr/article/details/2038904?utm_source=blogxgwz8

在Oracle中执行动态SQL的几种方法

在Oracle中执行动态SQL的几种方法

在一般的sql操作中,sql语句基本上都是固定的,如:
SELECT t.empno,t.ename  FROM scott.emp t WHERE t.deptno = 20;
但有的时候,从应用的需要或程序的编写出发,都可能需要用到动态SQl,如:
当 from 后的表 不确定时,或者where 后的条件不确定时,都需要用到动态SQL。

一、使用动态游标实现
1、声明动态游标
TYPE i_cursor_type IS REF CURSOR;
2、声明游标变量
my_cursor i_cursor_type;
3、使用游标
n_deptno:=20;
dyn_select := 'select empno,ename from emp where deptno='||n_deptno;
OPEN my_cursor FOR dyn_select;
LOOP 
  FETCH my_cursor INTO n_empno,v_ename;
  EXIT WHEN my_cursor%NOTFOUND;
  --用n_empno,v_ename做其它处理
  --....
END LOOP;
CLOSE dl_cursor;
4、小结:动态游标可以胜任大多数动态SQL的需求了,使用简洁方便居家旅行之必备杀人放火之法宝。

二、使用 EXECUTE IMMEDIATE
最早大家都使用DBMS_SQL包,但是太太麻烦了,最终都放弃了。但是自从有了EXECUTE IMMEDIATE之后,但要注意以下几点:
EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前,EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能,较之以前它相当容易编码.尽管DBMS_SQL仍然可用,但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。 
 使用技巧

1. EXECUTE IMMEDIATE将不会提交一个DML事务执行,应该显式提交
 如果通过EXECUTE IMMEDIATE处理DML命令,那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据

2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.

3. 当执行SQL语句时,不要用分号,当执行PL/SQL块时,在其尾部用分号.

4. 在Oracle手册中,未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.

5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中,Forms 6i不能使用此功能.

EXECUTE IMMEDIATE用法例子

1. 在PL/SQL运行DDL语句

begin
  execute immediate 'set role all';
 end;

2. 给动态语句传值(USING 子句)

declare
  l_depnam varchar2(20) := 'testing';
  l_loc    varchar2(10) := 'Dubai';
  begin
  execute immediate 'insert into dept values  (:1, :2, :3)'
    using 50, l_depnam, l_loc;
  commit;
 end;

3. 从动态语句检索值(INTO子句)

declare
  l_cnt    varchar2(20);
 begin
  execute immediate 'select count(1) from emp'
    into l_cnt;
  dbms_output.put_line(l_cnt);
 end;

4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.黓认为IN类型,其它类型必须显式指定

declare
  l_routin   varchar2(100) := 'gen2161.get_rowcnt';
  l_tblnam   varchar2(20) := 'emp';
  l_cnt      number;
  l_status   varchar2(200);
 begin
  execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'
    using in l_tblnam, out l_cnt, in out l_status;

if l_status != 'OK' then
     dbms_output.put_line('error');
  end if;
 end;

5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量

declare
    type empdtlrec is record (empno  number(4),ename  varchar2(20),deptno  number(2));
    empdtl empdtlrec;
 begin
    execute immediate 'select empno, ename, deptno '||'from emp where empno = 7934'
    into empdtl;
 end;

6. 传递并检索值.INTO子句用在USING子句前

declare
   l_dept    pls_integer := 20;
   l_nam     varchar2(20);
   l_loc     varchar2(20);
 begin
    execute immediate 'select dname, loc from dept where deptno = :1'
       into l_nam, l_loc
       using l_dept ;
 end;

7. 多行查询选项.对此选项用insert语句填充临时表,用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.
 
 declare
  l_sal   pls_integer := 2000;
 begin
  execute immediate 'insert into temp(empno, ename) ' ||
                   '          select empno, ename from emp ' ||
                   '          where  sal > :1'
    using l_sal;
  commit;
 end;

对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.当意图执行动态语句时,适当地处理异常更加重要.应该关注于捕获所有可能的异常.

ORACLE 动态执行SQL语句

博客分类:

  • Oracle

SQLOracleCC++C#

Oracle 动态SQL
Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediate,建议使用后者。试验步骤如下:

1. DDL 和 DML

Sql代码  

  1. /*** DDL ***/
  2. begin
  3. EXECUTE IMMEDIATE 'drop table temp_1';
  4. EXECUTE IMMEDIATE 'create table temp_1(name varchar2(8))';
  5. end;
  6. /*** DML ***/
  7. declare
  8. v_1 varchar2(8);
  9. v_2 varchar2(10);
  10. str varchar2(50);
  11. begin
  12. v_1:='测试人员';
  13. v_2:='北京';
  14. str := 'INSERT INTO test (name ,address) VALUES (:1, :2)';
  15. EXECUTE IMMEDIATE str USING v_1, v_2;
  16. commit;
  17. end;

2. 返回单条结果

Sql代码  

  1. declare
  2. str varchar2(500);
  3. c_1 varchar2(10);
  4. r_1 test%rowtype;
  5. begin
  6. c_1:='测试人员';
  7. str:='select * from test where name=:c WHERE ROWNUM=1';
  8. execute immediate str into r_1 using c_1;
  9. DBMS_OUTPUT.PUT_LINE(R_1.NAME||R_1.ADDRESS);
  10. end ;

3. 返回结果集

Sql代码  

  1. CREATE OR REPLACE package pkg_test as
  2. /* 定义ref cursor类型
  3. 不加return类型,为弱类型,允许动态sql查询,
  4. 否则为强类型,无法使用动态sql查询;
  5. */
  6. type myrctype is ref cursor;
  7. --函数申明
  8. function get(intID number) return myrctype;
  9. end pkg_test;
  10. /
  11. CREATE OR REPLACE package body pkg_test as
  12. --函数体
  13. function get(intID number) return myrctype is
  14. rc myrctype; --定义ref cursor变量
  15. sqlstr varchar2(500);
  16. begin
  17. if intID=0 then
  18. --静态测试,直接用select语句直接返回结果
  19. open rc for select id,name,sex,address,postcode,birthday from
  20. student;
  21. else
  22. --动态sql赋值,用:w_id来申明该变量从外部获得
  23. sqlstr := 'select id,name,sex,address,postcode,birthday from student
  24. where id=:w_id';
  25. --动态测试,用sqlstr字符串返回结果,用using关键词传递参数
  26. open rc for sqlstr using intid;
  27. end if;
  28. return rc;
  29. end get;
  30. end pkg_test;
  31. /

sql server 自定义函数的使用

自定义函数

用户定义自定义函数像内置函数一样返回标量值,也可以将结果集用表格变量返回

用户自定义函数的类型:

标量函数:返回一个标量值

表格值函数{内联表格值函数、多表格值函数}:返回行集(即返回多个值)

1、标量函数

Create function 函数名(参数)

Returns 返回值数据类型

[with {Encryption | Schemabinding }]

[as]

begin

SQL语句(必须有return 变量或值)

End

Schemabinding :将函数绑定到它引用的对象上(注:函数一旦绑定,则不能删除、修改,除非删除绑定)

Create function AvgResult(@scode varchar(10))

Returns real

As

Begin

Declare @avg real

Declare @code varchar(11)

Set @code=@scode + ‘%’

Select @avg=avg(result) from LearnResult_baijiali

Where scode like @code

Return @avg

End

执行用户自定义函数

select 用户名。函数名 as 字段别名

select dbo.AvgResult(‘s0002’) as result

用户自定义函数返回值可放到局部变量中,用set ,select,exec赋值

declare @avg1 real ,@avg2 real ,@avg3 real

select @avg1= dbo.AvgResult(‘s0002’)

set @avg2= dbo.AvgResult(‘s0002’)

exec @avg3= dbo.AvgResult ‘s0002’

select @avg1 as avg1 ,@avg2 as avg2 ,@avg3 as avg3

函数引用

create function code(@scode varchar(10))

returns varchar(10)

as

begin

declare @ccode varchar(10)

set @scode = @scode + ‘%’

select @ccode=ccode from cmessage

where ccode like @scode

return @ccode

end

select name from class where ccode = dbo.code(‘c001’)

2、表格值函数

a、 内联表格值函数

格式:

create function 函数名(参数)

returns table

[with {Encryption | Schemabinding }]

as

return(一条SQL语句)

create function tabcmess(@code varchar(10))

returns table

as

return(select ccode,scode from cmessage where ccode like @ccode)

b、 多句表格值函数

create function 函数名(参数)

returns 表格变量名table (表格变量定义)

[with {Encryption | Schemabinding }]

as

begin

SQL语句

end

多句表格值函数包含多条SQL语句,至少有一条在表格变量中填上数据值

表格变量格式

returns @变量名 table (column 定义| 约束定义 [,…])

对表格变量中的行可执行select,insert,update,delete , 但select into 和 insert 语句的结果集是从存储过程插入。

Create function tabcmessalot (@code varchar(10))

Returns @ctable table(code varchar(10) null,cname varchar(100) null)

As

Begin

Insert @ctable

Select ccode,explain from cmessage

Where scode like @code

return

End

Select * from tabcmessalot(‘s0003’)

https://www.cnblogs.com/hanruyue/p/5974036.html

Oracle 动态游标 PL/SQL 动态SQL语句 open for [using] 语句相关推荐

  1. 游标(概念、优点、分类、静态游标的使用(显示游标(显示游标的属性、遍历显示游标、显示游标的FOR循环)、隐式游标(隐式游标的属性))、动态游标的使用、静态游标和动态游标的区别、更新或删除当前游标数据

    文章目录 游标 游标概念 游标优点 游标分类 静态游标的使用 显示游标 显示游标的属性 遍历显示游标 显示游标的FOR循环 接收显式游标数据的数据类型(普通变量.记录变量.集合变量) 通过游标更新.删 ...

  2. oracle cusor游标,oracle 游标cursor

    游标 声明    不占内存 打开    申请内存    多行多列 获取    每次取一行, 关闭 隐式游标的属性: SQL%ROWCOUNT    成功操作的行的数量 SQL%FOUND        ...

  3. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

  4. oracle不使用游标,oracle – 为什么我们不能在动态SQL语句中使用强引用游标?

    这是一个带有强类型引用游标的过程: SQL> create or replace procedure p1 is 2 type dept_rc is ref cursor return dept ...

  5. ORACLE数据库之PL/SQL触发器、rownum、动态SQL、数据库之视图与索引

    WHEN子句说明触发约束条件.Condition为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL函数.WHEN子句指定的触发约束条件只能用在BEFORE和AFTER行 ...

  6. 使用Oracle的DBMS_SQL包执行动态SQL语句

    引用自:http://blog.csdn.net/ggjjzhzz/archive/2005/10/17/507880.aspx 在某些场合下,存储过程或触发器里的SQL语句需要动态生成.Oracle ...

  7. PL/SQL -- 动态SQL调用包中函数或过程

    动态SQL主要是用于针对不同的条件或查询任务来生成不同的SQL语句.最常用的方法是直接使用EXECUTE IMMEDIATE来执行动态SQL语句字符串或字符串变量.但是对于系统自定义的包或用户自定的包 ...

  8. Oracle 快速入门 PL/SQL游标

    目录 一.PL/SQL概念: ①数据类型: ②逻辑比较: ③控制语句: ④循环语句:有三种: 顺序语句:goto 标名--<<标名>>        ⑤异常: ⑥函数: 二.P ...

  9. PL/SQL -- 动态SQL

    --==================== -- PL/SQL --> 动态SQL --==================== 使用动态SQL是在编写PL/SQL过程时经常使用的方法之一.很 ...

最新文章

  1. (一)深入浅出图解Git,入门到精通(保姆级教程)
  2. AI在茫茫人海中,看到只有你被Deepfake了丨阿里安全出品
  3. linux shell 字符串 文件内容 大小写 转换 替换
  4. 网页游戏 服务器 性能测试工具,简单的压力测试工具
  5. ZedGraph怎样实现将图形右键菜单的打印和页面设置合并为打印的二级子菜单
  6. wordpress Oops! That page can’t be found.
  7. postgresql数据库去重方法
  8. JavaScript Function.arguments 属性详解
  9. MySQL给新建用户并赋予权限
  10. 百度推出完全端到端的并行音频波形生成模型,比WaveNet快千倍 | 论文
  11. Javascript第六章闭包closure规则第三课
  12. JS之——设置cookie 删除cookie
  13. WGS-84与北京-54、西安-80及地方坐标系的转换
  14. Java二分查找算法详解
  15. 游戏资源提取软件介绍
  16. 前端-JS基础之数据类型
  17. 安规电容与普通电容的区别
  18. 山东大学计算机学院 论坛,计算机学院承办计算机学科发展高峰论坛_山东大学...
  19. 【网站】国内 前6名 Java开源CMS建站系统
  20. 《2018年中国新零售“50强榜”》

热门文章

  1. IP地址测试用例编写
  2. mysql 1032错误_如何快速解决MySQL 1032 主从错误
  3. 计数器控制led灯的亮灭
  4. python爬虫之爬取网易云音乐的歌曲图片和歌词
  5. CAN工具 - PCAN - 半自动化
  6. 1.4 极限的运算法则
  7. 高等数学之极限的原理及易错题计算
  8. Postgresql12 安装及设置远程访问
  9. 微信网址打开php,微信打开网址添加在浏览器中打开提示
  10. PHP webshell、暴力破解