存储过程函数

WHO_AM_I()

CREATE OR REPLACE FUNCTION WHO_AM_I
RETURN VARCHAR2
IS
   l_owner varchar2(30);
   l_name varchar2(30);
   l_lineno number;
   l_type varchar2(30);
BEGIN
   who_called_me( l_owner, l_name, l_lineno, l_type );
   RETURN l_name;
END;

WHO_CALLED_ME

CREATE OR REPLACE PROCEDURE WHO_CALLED_ME (owner    out varchar2,
                                          name     out varchar2,
                                          lineno   out number,
                                          caller_t out varchar2)
as
  call_stack  varchar2(4096) default dbms_utility.format_call_stack;
  n           number;
  pos         NUMBER;
  found_stack BOOLEAN default FALSE;
  line        varchar2(255);
  cnt         number := 0;
begin
  --dbms_output.put_line(call_stack);
  loop
    n := instr(call_stack, chr(10));
    exit when(cnt = 3 or n is NULL or n = 0);
    --
    line := substr(call_stack, 1, n - 1);
    --dbms_output.put_line(‘line:‘||substrb(line,1,255));
    call_stack := substr(call_stack, n + 1);
    --
    if (NOT found_stack) then
      if (line like ‘%handle%number%name%‘) then
        found_stack := TRUE;
      end if;
    else
      cnt := cnt + 1;
      -- cnt = 1 is ME
      -- cnt = 2 is MY Caller
      -- cnt = 3 is Their Caller
      if (cnt = 3) then
        --lineno := to_number(substr( line, 13, 6 ));
        --QianDS Add 2005-6-16 20:13
        pos    := INSTRB(line, ‘ ‘, 1);
        lineno := to_number(substr(line, pos, 10));
        -------------------------------/
        --line := substr( line, 21 );
        --QianDS Add 2005-6-16 20:13
        line := substr(line, pos + 12);
        -------------------------------/
        if (line like ‘pr%‘) then
          n := length(‘procedure ‘);
        elsif (line like ‘fun%‘) then
          n := length(‘function ‘);
        elsif (line like ‘package body%‘) then
          n := length(‘package body ‘);
        elsif (line like ‘pack%‘) then
          n := length(‘package ‘);
        elsif (line like ‘anonymous%‘) then
          n := length(‘anonymous block ‘);
        else
          n := null;
        end if;
        if (n is not null) then
          caller_t := ltrim(rtrim(upper(substr(line, 1, n - 1))));
        else
          caller_t := ‘TRIGGER‘;
        end if;

        line  := substr(line, nvl(n, 1));
        n     := instr(line, ‘.‘);
        owner := ltrim(rtrim(substr(line, 1, n - 1)));
        name  := ltrim(rtrim(substr(line, n + 1)));
      end if;
    end if;
  end loop;
end;

P_SYS_PROCEDURE

CREATE OR REPLACE PROCEDURE P_SYS_PROCEDURE
(
   v_pro_id       IN VARCHAR2,
   v_pro_type     IN VARCHAR2,
   v_cycle        IN VARCHAR2,--处理周期
   v_channel      IN NUMBER,--通道号
   v_tag          IN NUMBER,--0,过程开始1,过程结束
   v_execcycle    OUT VARCHAR2,
   v_result_tag   OUT CHAR
)
-----------------------------------------------------------------------
-- PROCEDURE:      P_SYS_PROCEDURE
-- Description:   填写过程执行日志
-- Author:        linage_stat
-- Date:          2005/04/13
-- Editor:        EditPlus 2.11
-----------------------------------------------------------------------

IS
   iv_err_code          VARCHAR2(20);
   iv_err_log           VARCHAR2(2000);
   iv_execpro_id        NUMBER;
BEGIN
   v_result_tag := ‘N‘;
   --处理过程执行周期
   IF v_cycle IS NULL THEN
      IF v_pro_type IN (‘1‘,‘2‘) THEN
         v_execcycle := ENVINFO.PREVIOUS_DAY;
      ELSE
         v_execcycle := ENVINFO.PREVIOUS_MONTH;
      END IF;
   ELSE
      IF v_pro_type IN (‘1‘,‘2‘) THEN

         v_execcycle := to_char(to_date(v_cycle,‘yyyymmdd‘),‘yyyymmdd‘);
      ELSE
         v_execcycle := to_char(to_date(v_cycle,‘yyyymm‘),‘yyyymm‘);
      END IF;
   END IF;

   --判断是否为过程开始执行
   IF v_tag = 0 THEN
      INSERT INTO tf_s_pro_log
              (EXECPRO_ID,SESSION_ID,SESSION_USER,PRO_ID,EXEC_CYCLE,CHANNEL_NO,BEGIN_DATE)
      SELECT f_sys_getseqid(),ENVINFO.SESSIONID,ENVINFO.SESSION_USER,v_pro_id,v_execcycle,v_channel,SYSDATE
        FROM DUAL;
      COMMIT;
      v_result_tag := ‘Y‘;
   ELSIF v_tag = 1 THEN
      SELECT MAX(execpro_id)
        INTO iv_execpro_id
        FROM tf_s_pro_log
       WHERE pro_id = v_pro_id
         AND end_date IS NULL
         AND nvl(channel_no,0) = nvl(v_channel,0)
         AND exec_cycle = v_execcycle;

      v_result_tag := ‘Y‘;
      iv_err_code := ‘ORA-0000‘;

      UPDATE tf_s_pro_log
         SET (end_date,result_tag,err_code,err_log) =
             (SELECT SYSDATE,v_result_tag,iv_err_code,‘‘ FROM DUAL)
       WHERE execpro_id = iv_execpro_id;
      COMMIT;
   ELSE
      v_result_tag := ‘N‘;
   END IF;

EXCEPTION
   WHEN OTHERS THEN
      iv_err_log := SQLERRM;
      iv_err_code := SUBSTR(SQLERRM,1,instr(SQLERRM,‘:‘)-1);
      INSERT INTO tf_s_pro_log
             (EXECPRO_ID,SESSION_ID,SESSION_USER,PRO_ID,EXEC_CYCLE,CHANNEL_NO,BEGIN_DATE,END_DATE,RESULT_TAG,ERR_CODE,ERR_LOG)
      SELECT f_sys_getseqid(),ENVINFO.SESSIONID,ENVINFO.SESSION_USER,v_pro_id,v_cycle,v_channel,SYSDATE,SYSDATE,‘N‘,iv_err_code,iv_err_log
        FROM DUAL;
      COMMIT;
END;
时间: 2024-12-18 10:16:18

存储过程函数的相关文章

mysql使用存储过程&函数实现批量插入

写这边文章的目的,是想结合mysql 存储过程+函数完成一个批量删除的功能吧...正好也好加深下对procedure和function的熟练操作吧...废话不多说,我就直接上表结构啦哈,如下: create table dept( id int unsigned primary key auto_increment, deptno mediumint unsigned not null default 0, dname varchar(20) not null default "",

MySQL mysqldump 导入/导出 结构&数据&存储过程&函数&事件&触发器

———————————————-库操作———————————————-1.①导出一个库结构 mysqldump -d dbname -u root -p > xxx.sql ②导出多个库结构 mysqldump -d -B dbname1 dbname2 -u root -p > xxx.sql 2.①导出一个库数据 mysqldump -t dbname -u root -p > xxx.sql ②导出多个库数据 mysqldump -t -B dbname1 dbname2 -u r

OTL调用存储过程/函数及注意事项

OTL 是 Oracle, Odbc and DB2-CLI Template Library 的缩写,是一个 C++ 编译中操控关系数据库的模板库,它目前几乎支持所有的当前各种主流数据库. OTL 使用起来比较方便,其官方网站也提供了详细的文档和例子( http://otl.sourceforge.net/otl3.htmhttp://otl.sourceforge.net/otl3_examples.htm ). 最近在项目中需要使用 OTL 调用 Oracle 存储过程,并且需要返回游标,

查看SQL SERVER 加密存储过程,函数,触发器,视图

原文:查看SQL SERVER 加密存储过程,函数,触发器,视图 create  PROCEDURE sp_decrypt(@objectname varchar(50))ASbeginset nocount on--CSDN:j9988 copyright:2004.07.15 --V3.2 --破解字节不受限制,适用于SQLSERVER2000存储过程,函数,视图,触发器--修正上一版"视图触发器"不能正确解密错误--发现有错,请E_MAIL:[email protected]be

Mysql学习---视图/触发器/存储过程/函数/索引 180101

视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由于视图是虚拟表,所以无法使用其对真实表进行创建.更新和删除操作,PyMysql是支持视图的. 仅能做查询用. 创建视图: create VIEW stu as select * from student; # 这里只是建立了一个对应关系,视图是虚表,动态获取数据 select * from stu;

MySQL-视图-触发器-事务-存储过程-函数-流程控制-索引与慢查询优化-06

目录 视图*** 什么是视图 为什么要用视图 如何生成视图 修改视图 --> 最好(千万)不要 关联表数据改动前 关联表数据改动之后 触发器 什么是触发器 触发条件 触发器语法结构 修改mysql的默认结束符(;) 触发器死循环 六个触发器的执行时机 新增前.新增后.删除前.删除后.更新前.更新后 NEW对象指代的就是当前记录(对象) 事务 ***** 什么是事务 事务的四大特性 ACID A:原子性 atomicity C:一致性 consistency I:隔离性 isolation D:持

视图 触发器 存储过程 函数 流程过程 索引 慢查询

视图 触发器 存储过程 函数 流程过程 索引 慢查询 视图 触发器 事务 存储过程 内置函数 流程控制 索引 视图 1.什么是视图 ? 视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可 2.为什么要用视图 ? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view teacher2course as select * from teacher inner join course on teacher.tid = course.teacher_id; 强调

sqlserver中的存储过程 函数 事物 索引及视图

                                       存储过程和函数具体的区别: 核心提示:本质上没区别.只是函数有限制只能返回一个标量,而存储过程可以返回多个.并且函数是可以嵌入在SQL中使用的,可以在SELECT等SQL语句中调用,而存储过程不行.执行的本质都一样. 函数限制比较多,如不能用临时表,只能用表变量等,而存储过程的限制相对就比较少. 1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强. 2. 对于存储过程来说可以返回参数,而函数只

MS SQL 批量给存储过程/函数授权

在工作当中遇到一个类似这样的问题:要对数据库账户的权限进行清理.设置,其中有一个用户Test,只能拥有数据库MyAssistant的DML(更新.插入.删除等)操作权限,另外拥有执行数据库存储过程.函数的权限,但是不能进行DDL操作(包括新建.修改表.存储过程等...),于是需要设置登录名Test的相关权限: 1:右键单击登录名Test的属性. 2: 在服务器角色里面选择"public"服务器角色. 3:在用户映射选项当中,选择"db_datareader".&qu

hibernate调用oracle存储过程||函数

pakeage dao.Impl; //调用函数FUN_GET(); public String get(String Id,String Name){ return getSession().createSQLQuery("select FUN_GET(?,?) from dual") .setParameter(0, Id).setParameter(1, Name).uniqueResult() .toString(); } //uniqueResult()  返回唯一值 //调