• 【oracle】procedure, function,绑定变量


    1124-01 procedure, function,绑定变量

    补充:子程序中的 查询语句,dml,ddl,tcl语句
    1.查询语句
    1)静态语句:select into from;

    2)动态语句:execute immediate <vv_sql> into <vv_result>;

    2.DML,TCL

    1)静态SQL
    2)动态SQL:execute immediate <vv_sql>;
    3. DDL
    1) 动态SQL
    注意:如果 数据库对象的名称,字段名称 是用字符串变量或字符串拼接 得到的,那么只能用 动态SQL,否则不会被解析为 数据库对象,而作为普通字符串。
    ——procedure
    语法:
    create or replace procedure <procedure> (
    参数1 in 数据类型,
    参数2 out 数据类型,

    )
    is
    变量|数据类型的定义
    begin
    <body>
    exception
    <exception_handler>
    end <procedure>;
    /

    说明:参数的数据类型, 不可指定数据类型的长度。

    调用方式:
    1. 普通变量
    <procedure>(<参数列表>);
    2.绑定变量
    execute <procedure>(<参数列表>);
    或者
    call <procedure>(<参数列表>);

    【例子】
    set serveroutput on;
    /*定义存储过程*/
    create or replace procedure prc_getCnt(
    ii_serial_no in integer,
    oi_result out integer
    )
    is
    begin
    select count(*) into oi_result from t_sales where serial_no >= ii_serial_no;
    exception
    when others then
    oi_result := sqlcode;
    end prc_getCnt;
    /

    /*调用*/
    set serveroutput on;
    --参数为 1.普通变量
    declare
    vi_serial_no integer;
    vi_result integer;
    begin
    vi_serial_no := 2;
    prc_getCnt( vi_serial_no, vi_result );
    dbms_output.put_line(vi_result);
    end;
    /


    set serveroutput on;
    --参数为 2.绑定变量
    variable vi_serial_no number; --定义
    variable vi_result number;
    execute :vi_serial_no := 2; --赋值
    print vi_serial_no;
    print vi_result;
    execute prc_getCnt(:vi_serial_no,:vi_result); --引用
    --call prc_getCnt(:vi_serial_no,:vi_result); --此处call 等同于 execute
    print vi_result;


    说明:oracle的普通变量,参数最终都被解析为绑定变量的。
    动态绑定变量的使用场景:
    1. 调用procedure,function
    2. ref cursor游标的定义

    绑定变量 参考:
    使用绑定变量的一点总结!
    http://wenku.baidu.com/view/9cd65005284ac850ad0242b0.html?from=search

    Oracle数据库的绑定变量特性及应用 http://wenku.baidu.com/view/92be30c24028915f804dc280.html?from=search


    ——function
    语法:
    create or replace function <function> (
    参数1 in 数据类型,
    参数2 out 数据类型,

    )
    return 数据类型
    is
    变量|数据类型的定义
    begin
    <body>
    exception
    <exception_handler>
    end <procedure>;
    /

    说明:参数|return的数据类型, 不可指定数据类型的长度。


    1. ORA-14552:cannot perform a DDL,commit or rollback inside a query or DML.
    即当function中执行DDL,commit,rollback语句时,不可以用a query ,DML 调用该function。

    /*举例:删除指定数据库对象*/
    create or replace function fnc_drop_object(
    iv_obj_name in varchar2(30)
    )
    return integer
    is
    oi_result integer;
    vv_obj_type varchar2(30);
    vv_sql varchar2(500);
    begin
    /**@description 删除类型为 TABLE,SEQUENCE,VIEW,SYNONYM 的数据库对象*/
    select object_type into vv_obj_type from user_objects where object_name = upper('iv_obj_name');
    if (vv_obj_type is not null) and (instr('TABLE$SEQUENCE$VIEW$SYNONYM',vv_obj_type) > 0) then
    vv_drop_sql := 'drop '||vv_obj_type||' '||iv_obj_name;
    execute immediate vv_sql;
    oi_result := 0;
    end if;
    return oi_result;
    exception
    when others then
    oi_result := sqlcode;
    return oi_result;
    end;
    /

    调用方式1.a query :报错 ORA-14552
    set serveroutput on;
    select fnc_drop_object('seq_test01') from dual;

    调用方式2.定义变量接收return:正确
    set serveroutput on;
    declare
    vi_result integer;
    begin
    vi_result := fnc_drop_object('seq_test01');
    dbms_output.put_line(vi_result);
    end;
    /

    调用方式2.定义绑定变量接收return:正确
    set serveroutput on;
    var vi_result number; --没有integer 类型
    -- variable vi_result number;
    print vi_result; --默认值为null
    exec :vi_result := fnc_drop_object('seq_test01');
    -- execute :vi_result := fnc_drop_object('seq_test01');
    print vi_result;


    调用方式3.dbms_output打印:正确
    set serveroutput on;
    begin
    dbms_output.put_line(to_char( fnc_drop_object('seq_test01')));
    end;
    /

    调用方式4.:同3,正确
    set serveroutput on;
    execute dbms_output.put_line(to_char( fnc_drop_object('seq_test01'))); --execute 相当于 在plsql 块前后分别 加上 begin 和 end;

    /*例子:周函数*/
    create or replace function fnc_get_weekend(statis_date in number(8))
    return integer;
    is
    oi_result integer;
    begin
    select to_number(to_char(next_day(to_date(to_char(statis_date),'yyyymmdd'),'sunday') -7 ,'yyyymmdd'))
    into oi_result from dual;
    return oi_result;
    exception
    when others then
    oi_result := sqlcode;
    return oi_result;
    end;
    /

  • 相关阅读:
    live 555 freebsd 或centos 7.4 实现代理视频直播服务
    [教学] Log.d 日志调试查看(所有平台)
    [示例] 使用 TStopwatch 计时
    [安裝] Ubuntu Server 初试
    [改善] dcef3 for Firemonkey 浏览器控件,拉动窗体大小会闪烁的问题
    [示例] Drag And Drop for FireMonkey (Win & macOS)
    [原创] 改善 Firemonkey Canvas 几何绘图质量问题(移动平台)
    [示例] Firemonkey 画出 1 点像素的线
    [修正] Firemonkey TFrame 存档后,下次载入某些事件连结会消失(但源码还在)
    [问答] Firemonkey 控件继承后无法显示(空白)
  • 原文地址:https://www.cnblogs.com/greenZ/p/8721887.html
Copyright © 2020-2023  润新知