Oracle 动态游标 PL/SQL 动态SQL语句 open for [using] 语句

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语句

博客分类:

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.   
  7. /*** DML ***/  
  8. declare  
  9.     v_1 varchar2(8);  
  10.     v_2 varchar2(10);  
  11.     str varchar2(50);  
  12. begin  
  13.     v_1:='测试人员';  
  14.     v_2:='北京';  
  15.     str := 'INSERT INTO test (name ,address) VALUES (:1, :2)';  
  16.     EXECUTE IMMEDIATE str USING v_1, v_2;  
  17.     commit;  
  18. 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.     --函数申明  
  9.     function get(intID number) return myrctype;  
  10. end pkg_test;  
  11. /  
  12.   
  13. CREATE OR REPLACE package body pkg_test as  
  14. --函数体  
  15.     function get(intID number) return myrctype is  
  16.         rc myrctype; --定义ref cursor变量  
  17.         sqlstr varchar2(500);  
  18.     begin  
  19.         if intID=0 then  
  20.             --静态测试,直接用select语句直接返回结果  
  21.             open rc for select id,name,sex,address,postcode,birthday from  
  22. student;  
  23.         else  
  24.             --动态sql赋值,用:w_id来申明该变量从外部获得  
  25.             sqlstr := 'select id,name,sex,address,postcode,birthday from student  
  26. where id=:w_id';  
  27.             --动态测试,用sqlstr字符串返回结果,用using关键词传递参数  
  28.             open rc for sqlstr using intid;  
  29.         end if;  
  30.   
  31.         return rc;  
  32.     end get;  
  33.   
  34. end pkg_test;  
  35. /  

   

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

猜你喜欢

转载自blog.csdn.net/xuheng8600/article/details/84891050