精华内容
下载资源
问答
  • oracle存储过程定义变量
    2021-12-09 16:34:29

     PLSQL编程中常见的两大分类:
    1.普通数据类型(char,vchar2,date,number,boolean,long)
    2,特殊变量类型(引用型变量,记录型变量)
     

    更多相关内容
  • C# 传入自定义列表List 到Oracle存储过程 亲测有效,执行速度极快
  • 一.首先变量的声明有3中方式 ...注:存储过程中声明变量必须在begin之前 并且声明字符串时必须指定大小,不然会报错 2.使用%TYPE声明 ①格式:变量名 表名.字段名%TYPE ②含义:该变量的数据类型与指定...

    一.首先变量的声明有3中方式

    1.按数据类型进行声明

    ①直接声明数据类型

    ②格式:变量名  数据类型(大小)

    V_TEST varchar2(20);
    V_NUM  number;

     注:存储过程中声明变量必须在begin之前

           并且声明字符串时必须指定大小,不然会报错

    2.使用%TYPE声明

    ①格式:变量名  表名.字段名%TYPE

    ②含义:该变量的数据类型与指定表的指定字段的数据类型一致

    V_NAME DFGZ_PKG.NAME%TYPE;

    3.使用%ROWTYPE声明

    ①变量名  表名%ROWTYPE

    ②含义:该变量的数据类型与指定表的指定行记录(所有字段)的数据类型一致

    --V_TOTALL_ROW 表的整行数据
    V_TYPE_TOTALL_ROW  V_TOTALL_ROW%ROWTYPE;

    总结:

           ①在Oracle的存储过程中变量的声明不区分大小写

           ②变量的使用必须声明

    二.变量的赋值(3种方式)

    1.直接赋值法

    ①使用 “:=”

    ②使用条件:适用于声明变量的前两种方式

    V_COLUMN :='100';

    ③变量后面不能直接跟sql语句,负责sql不会执行,如

    --错误做法
    V_LOGO :=SELECT REVC_SIGN INTO V_LOGO FROM DFGZ_PKG;
    
    --正确做法
    V_LOGO :=‘SELECT REVC_SIGN INTO V_LOGO FROM DFGZ_PKG’;

    ④变量的声明和赋值可以一块进行

    create....
    
    --开始给变量赋值
    V_sql :='select reve_state from dfgz_pkg where fileNum=5';
    
    begin
    
    /*
      具体业务部分
     */
    
    end;

    2.select 表字段 into 变量 from  表

    方式一:

    ①查询指定表的所有字段

    ②适用于声明变量的前2种方式可以使用

    --根据代发工资个人id查询对应的父机构(代发单位)序列
    SELECT REVC_SIGN INTO V_LOGO FROM DFGZ_PKG 
     
     WHERE REVCID=(SELECT PARENTID FROM DFGZ_PKG WHERE REVEID = V_REVCID);

    方式二:

    ①查询指定表的所有字段

    ②适用于声明变量的第3种方式

    --将id=2203的DFGZ_PKGMX表数据赋值给变量V_COLUMN_SID;
    
    SELECT * INTO  V_COLUMN_SID FROM DFGZ_PKGMX T WHERE t.id=2203

    注:

    ①查询结果只能返回一条记录

    ②查询的表字段必须是该表的所有字段

    --错误示例一:查询的是所有记录
    
    select * into V_COLUMN_SID  from DFGZ_PKGMX T;
    --错误示例二:查询的是该表的多个字段
    
    select  t.id,t.name into V_COLUMN_SID  from dfgz_pkgmx t;

    3.execute immediate sql语句字符串 into 变量

    declare /*存储过程,不需要声明*/
    
       v_sql varchar2(200);
    
       v_revc_row varchar2(200);
    
    begin
    
        v_sql:='select v_revc_row  from dfgz_send where revc_id=22150';
    
        --v_revc_row 赋值
    
        execute immediate v_sql into v_v_revc_row ;
    
         --打印结果(Oracle自带日志打印功能)
    
         DBMS_OUTPUT.put_line(v_revc_row  );
    
    end;

    三.变量的调用

    1.通常来说,变量只有这3种使用场景:赋值、逻辑判断、算术运算

    2.平常不能用作查询列

    --错误调用
    
    select v_reve_sign from dual;

    3.使用%ROWTYPE声明的变量如何调用?

      利用“变量名.表字段”的方式可以取到该表中指定行(返回行)的指定列(任意列)所代表的数据。 

    --  v_revc_row  赋值
    
    select v_revc_row  from dfgz_send where revc_id=22150;
    
    -- 调用
    
    DBMS_OUTPUT.put_line(dfgz_send.id);

     

    展开全文
  • oracle存储过程----变量的介绍及使用(PL/SQL)

    万次阅读 多人点赞 2018-08-17 08:16:00
    oracle存储过程—-变量的介绍及使用   学习一门语言,既然学会了hello word 的输出,那就要关注下基础,首先要熟悉存储过程 中的变量类型。   关于存储过程变量有哪些 ,这样的问题,我在百度上搜索,却发现很...

    上一篇 oracle存储过程—-入门存储过程

    oracle存储过程—-变量的介绍及使用

      学习一门语言,既然学会了hello word 的输出,那就要关注下基础,首先要熟悉存储过程 中的变量类型。
      关于存储过程变量有哪些 ,这样的问题,我在百度上搜索,却发现很多没用的,最近在同事那里,忽然看到一本《oracle从入门到精通》,搜了一下,发现了存储过程 的东西,却是PL/SQL 中的基础知识 ,好尴尬啊。
    这里写图片描述
      通过学习,了解到了变量的一些知识。
    变量的分类如下:

    存储过程中的变量:
    一、标量类型 (有%TYPE)
    二、复合类型
         (1)记录类型 (有%ROWTYPE)
         (2)索引表类型(关联数组)
         (3)varry变长数组

    一、标量类型

      标量类型,一种是常用的有NUMBERCHARVARCHAR2VARCHARNCHARNVARCHAR2LONGDATETIMESTAMP ,基本上oracle 数据库认识的类型都可以直接用了。
      还有一些我觉得不常用的,PLS_INTEGERBINARY_INTEGERSIMPLE_INTEGER布尔类型(可以用来存储逻辑的值,不能用作定义表中的数据类型)
      另外还有一个最常用的 %TYPE
      因为上一篇已经简单用过第一种,所以这里介绍一下%TYPE
      %TYPE 这种方式定义的变量类型的方式和其他的有所不同,它利用已经存在的数据类型来定义新数据的数据类型。例如,当定义多个变量或常量时,只要前面使用过的数据类型,后边的变量就可以利用%TYPE 引用,最常见的就是把表中的字段类型作为变量或常量的数据类型。使用此种方式的好处有以下几点:

    1. 利用%TYPE 方式定义的变量类型和被引用的常量数据类型保持一致,如果以前是VARCHAR 类型,现在要改成NUMBER 类型,那就只需要直接改数据表中的类型即可,对已写好的存储过程 没有影响。
    2. 还有个好处就是,存储过程 基本都会有表操作,这就避免了在数据传入的时候,引发数据溢出或不符的情况。比如数据库里是VARCHAR(1) 这样的,但是实际传入的可能是张三 这样的字符串,肯定会导致在执行到这行数据的时候引发异常。如果能用%TYPE,那在调用存储过程 的时候,就能抛出错误。

    如下图所示:
      sex LY_DS.LY_NB%TYPE ,表示:
      定义一个变量sex,它的类型与表LY_DS中的字段LY_NB` 类型一致。

    create or replace procedure test_select_procedure
    (sex  LY_DS.LY_NB%TYPE,countNum out number)
    AS
    BEGIN
    select count(*) into countNum from ly_ds where LY_NB=sex;
    dbms_output.put_line(countNum);
    END;

    二、复合类型

    1、记录类型

      如果在存储过程中查询结果中,是多列的情况,我们可能需要查询到结果后,对其做引用名称.成员名称 这样取值。上一篇中说到过,可以使用into,即如下写法:

    create or replace procedure test_select2_procedure
    (sex  varchar)
    AS
    countNum number(10); --别忘了写上具体的长度,并且以分号结束
    maxId number(10); --别忘了写上具体的长度,并且以分号结束
    BEGIN
    select count(*),max(id) into countNum,maxId from ly_ds where LY_NB=sex;
    dbms_output.put_line(countNum);
    dbms_output.put_line(maxId);
    END;

      上边的是一种写法,就是into 后边跟上定义好的多个标量类型 。但是如果字段很多呢?
      显而易见,再用这个into 就不合适了,记录类型 就是解决这个的。

    (1)定义type 的声明写法

      定义type 的写法为 type type_name is record(col_name col_type); 这样,括号里可以写多个,中间用 , 分割,但最后一个不能有 , ,具体如下:

    set serveroutput on;
    DECLARE
    TYPE new_type IS RECORD   --以TYPE type_name IS RECORD开始
    (
       v_ly_nl LY_DS.LY_NL%TYPE,
       v_ly_mc varchar(100) --最后不要加,   
    );  --最后以 ;结束
    v_obj new_type; --将新对象定义为刚才声明的类型
    BEGIN
     --into赋值给v_obj,会按照定义的type顺序赋值
    select ly_nl,ly_mc into v_obj from ly_ds where id='2'; 
    dbms_output.put_line('第一个变量:'||v_obj.v_ly_nl);
    dbms_output.put_line('第二个变量:'||v_obj.v_ly_mc);
    END;

      输出结果如下:

    匿名块已完成
    第一个变量:22
    第二个变量:王五
    
    (2)通过%ROWTYPE 的声明写法

      %ROWTYPE 该类型是提取行记录时常用的存储数据的方式。这种声明方式,可以直接引用表中的行作为变量类型,它同%TYPE 在优点上类似,避免因表中字段的数据类型改变,而导致PL/SQL 块出错的问题。
      下边是%ROWTYPE 的用法例子,挺简单的:

    set serveroutput on;
    DECLARE
    v_obj ly_ds%rowtype; --ROWTYPE不区分大小写
    BEGIN
     --into赋值给v_obj,会按照定义的type顺序赋值
    select * into v_obj from ly_ds where id='2'; 
    dbms_output.put_line('第一个变量:'||v_obj.ly_nl);
    dbms_output.put_line('第二个变量:'||v_obj.ly_mc);
    END;

      注意一个地方,就是上边的into 前边,只能为 * ,如果要写为具体的列,那就要写全

    2、索引表类型(关联数组)

      该类型与数组相似,利用键值查找对应的数据,但是这里的键值同我们真正的数组下标不同,这种索引表的下标,还可以为字符串,真正的数组下标都是数字。索引表中的数据可以是上边介绍过的标量类型,也可以是记录类型。当在赋值的过程中,对已存在的索引表下标重复赋值,则会替换以前的数据,这个很好理解。

      以下是我学习的时候,记录的这部分内容,都写在了下边:

    set serveroutput on;
    DECLARE
      /**
       *声明一个存储ly_ds整行数据的索引表,下标为数字,
       *即 binary_integer
       */
      type index_row_type is table of ly_ds%rowtype
      index by binary_integer;
    
      /**
       *声明一个存储字符串数据的索引表,下标也为数字,
       *即 pls_integer
       */
      type index_val_type is table of varchar2(10)
      index by pls_integer;
    
      /**
       *声明一个存储字符串数据的索引表,下标为字符串,
       *即 varchar(100)、varchar(10),必须给固定大小
       */
      type index_str_val_type is table of varchar2(100)
      index by varchar(10);
       /**
        *定义一个下标为数字,存ly_ds一行的变量
        */
      v_row index_row_type; 
      /**
       *定义一个下标为数字,存字符串的变量
       */
      v_val index_val_type; 
      /**
       *定义一个下标为字符串,存字符串的变量
       */
      v_str_val index_str_val_type; 
    BEGIN
     /**
      *为下标为数字的 字符串索引表下标1赋值
      */
      v_val(1) :='正数'; 
      /**
      *为下标为数字的 字符串索引表下标-1赋值
      */
      v_val(-1) :='负数'; 
      dbms_output.put_line('v_val中下标1的值:'||v_val(1));
      dbms_output.put_line('v_val中下标-1的值:'||v_val(-1));
    
      /**
      *将改行数据赋值给行变量的下标1上
      */
      select * into v_row(1) from ly_ds where id='2'; 
      dbms_output.put_line('v_row(1)中ly_mc的值:'||v_row(1).ly_mc);
      dbms_output.put_line('v_row(1)中ly_nl的值:'||v_row(1).ly_nl);
    
       /**
        *为下标为字符串的 字符串索引表的下标one赋值
        */
      v_str_val('one') :='java天下第一';  
       /**
        *为下标为字符串的 字符串索引表的下标test赋值
        */
      v_str_val('test') :='java天下无敌'; 
       /**
        *为下标为字符串的 字符串索引表的下标test1赋值
        */
      v_str_val('test1') :='java太可怕了'; 
      dbms_output.put_line('v_str_val中下标one的值:'||v_str_val('one'));
      dbms_output.put_line('v_str_val中下标test的值:'||v_str_val('test'));
      dbms_output.put_line('v_str_val中第一个值的下标:'||v_str_val.first);
      dbms_output.put_line('v_str_val中第一个下标对应的值:'||v_str_val(v_str_val.first));
      dbms_output.put_line('v_str_val中最后一个下标:'||v_str_val.last);
    END;

      运行后会有下边的结果:

    匿名块已完成
    v_val中下标1的值:正数
    v_val中下标-1的值:负数
    v_row(1)ly_mc的值:王五
    v_row(1)ly_nl的值:22
    v_str_val中下标one的值:java天下第一
    v_str_val中下标test的值:java天下无敌
    v_str_val中第一个值的下标:one
    v_str_val中第一个下标对应的值:java天下第一
    v_str_val中最后一个下标:test1

      上边有个特别注意的问题,就是,定义下标和存储的值的时候,一定要给出大小,比如字符串,不能写成varchar ,必须要写成varchar(100) 这样有固定大小的类型。
      上边我用了三种,一种是pls_integerbinary_integer ,一种是ly_ds%rowtype ,这两种都有固定的大小,第一种是数字类型,它们有固定的大小,可以百度一下。如果定义了标量类型那种,必须要要给出大小,这个需要注意下。

    3、varry变长数组

      varry 数组,是另一种存储有序元素的集合。集合下标从1开始,比较适合较少的数据使用。具体如下:
      它有一个注意的地方,就是数组在定义一个变量时候,一定要初始化 ,并且,在使用前 一定要先确定容量 。对于,在初始化时,已赋值的,可以不用定义存储的大小了。这点与java 中的数组是一样的。

    set serveroutput on;
    DECLARE
      /**
       *声明一个最多容纳100个数的varry数组,注意,它的下标是从1开始的。
       *即 binary_integer
       */
      type array_type is varray(100) of varchar(100);
      /**
       *分别定义一个直接赋值的和两个未赋值的数组。
       *注意:一定要初始化,但可以不赋值。对于没有赋值的这种数组,在用之前
       *也一定要先确定容量。
       */
      v_val_array array_type := array_type('one','two');
      v_val_array2 array_type := array_type();
      v_val_array3 array_type := array_type();
    BEGIN
       /**
        *获取第一个varry数组中的值
        *varry的下标从1开始
        */
        dbms_output.put_line('v_val_array中下标1的值:'||v_val_array(1));
        dbms_output.put_line('v_val_array中下标2的值:'||v_val_array(2));
    
    
       /**
        *获取第二个varry数组中的值
        *因为第二个varry没有初始化长度,所以通过extend方法,
        *为该数组加一个空位
        */
        v_val_array2.extend;
        v_val_array2(1) :='aaa'; 
        v_val_array2.extend;
        v_val_array2(2) :='bbb'; 
        v_val_array2.extend;
        v_val_array2(3) :='ccc'; 
        dbms_output.put_line('v_val_array2中下标1的值:'||v_val_array2(1));
        dbms_output.put_line('v_val_array2中下标2的值:'||v_val_array2(2));
        dbms_output.put_line('v_val_array2中下标3的值:'||v_val_array2(3));
    
         /**
        *获取第三个varry数组中的值
        *因为第三个varry没有初始化长度,所以通过extend方法
        *初始化空位
        */
    
      /**
        *获取第二个varry数组中的值
        *因为第二个varry没有初始化长度,所以通过extend方法,
        *为该数组初始化长度
        */
        v_val_array3.extend(v_val_array2.count());
        v_val_array3(1) :='ddd'; 
        v_val_array3(2) :='eee'; 
        v_val_array3(3) :='fff'; 
        dbms_output.put_line('v_val_array3中下标1的值:'||v_val_array3(1));
        dbms_output.put_line('v_val_array3中下标2的值:'||v_val_array3(2));
        dbms_output.put_line('v_val_array3中下标3的值:'||v_val_array3(3));
    END;

      执行后的结果为:

    匿名块已完成
    v_val_array中下标1的值:one
    v_val_array中下标2的值:two
    v_val_array2中下标1的值:aaa
    v_val_array2中下标2的值:bbb
    v_val_array2中下标3的值:ccc
    v_val_array3中下标1的值:ddd
    v_val_array3中下标2的值:eee
    v_val_array3中下标3的值:fff

      上边分别是三种情况,其中有extend ,可能新手会感到迷惑。
      因为v_val_array2v_val_array3 开始的时候,只是定义了变量,所以,在使用前,需要给出大小,extent 的用法,即是对数组的长度加1个空位 的意思。
      如果想直接为v_val_array3给出固定大小,可以直接v_val_array3.extend(3) ,这样就会给v_val_array3 一个默认的存储大小为3 ,也可以通过已有数组的大小,即是上边的v_val_array3.extend(v_val_array2.count())

      虽然上边都是PL/SQL 那边的知识,但是它们在存储过程 中,都是通用的。变量这地方,浪费了挺长的时间,但是基础有利用后边的学习,我觉得浪费了这两天应该会对自己有用处的。
      下一篇 oracle存储过程—-存储过程执行简单的增删改查sql

    展开全文
  • oracle 存储过程定义变量

    千次阅读 2014-11-15 14:43:31
    create or replace procedure proc1 is p_name sut.name%type; begin select name into p_name from sut where id='12072226'; dbms_output.put_line(p_name); end proc1; / ...注意定义方式
    create or replace procedure proc1
    is
    p_name sut.name%type;
    begin
    select name into p_name from sut where id='12072226';
    dbms_output.put_line(p_name);
    end proc1;

    /


    注意定义方式

    展开全文
  • 下面通过一个简单的存储过程代码段说明了该问题:CREATE OR REPLACE PROCEDURE load_error ISV_td1 test1.td1%TYPE;v_td1xh test1.td1xh%TYPE;v_gxsj timestamp ; -- 时间戳变量v_zhxgsj timestamp ;V_COUNT NUMBER ....
  • Oracle存储过程及调用

    2020-12-16 01:18:05
    Oracle存储过程语法 Oracle的存储过程语法如下: create procedure 存储过程名称(随便取) is 在这里可以定义常量、变量、游标、复杂数据类型这里可以定义变量、常量 begin 执行部分 end; (2)带参数的存储...
  • Oracle存储过程变量赋值的方法

    万次阅读 2016-07-04 15:42:26
    截止到目前我发现有三种方法可以在存储过程中给变量进行赋值: 1、直接法 :=  如:v_flag := 0; 2、select into  如:假设变量名为v_flag,select count(*) into v_flag from students; 3、execute ...
  • 存储过程变量的声明和赋值
  • ORACLE存储过程定义数组并且判断某值是否在数组中。有例子可執行、 、有例子可執行、
  • 主要介绍了oracle 创建,删除存储过程,参数传递,创建,删除存储函数,存储过程和函数的查看,包,系统包等相关资料,需要的朋友可以参考下
  • ORACLE_存储过程_赋值

    2021-05-01 10:55:10
    oracle变量赋值有两种一种是直接:=,两个字符串的连接不可以用 '+' ,要用 '||'还有就是select into下面是我写的例子:create or replace procedure DAILYSTATIC isMAX_TMP int;AVG_TMP int;HIGH_TIME date;TELEPHONE...
  • 一组用于完成特定数据库功能的SQL语句集,该SQL语句...Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常处理。存储过程基本结构:CREATE [ OR REPLACE ] PROCEDURE 存储过程名称(参数名 in 类型, 参...
  • 声明变量的关键字:define variable declare一、define关键字(host变量)host变量的作用是一个替换作用,是主机环境与oracle进行交互的变量,定义host变量时必须同时指定变量名和变量的值,定义变量不可以指定数据...
  • PL/SQL存储过程变量:declare 本文将对Oracle SQL中的变量进行分析探讨。 1. 脚本替换变量 替换变量可以放在SQL或PL/SQL语句中的任意位置,包含select值或字段,from表名,where字段或条件,orde
  • C# 调用存储过程 参考了很多文章,写了如下文字,算是分享吧 目的:更改积分,并作一定校验 一般的调试方法: DECLARE myresult INT; BEGIN P_CHANGEVIPBALANCE('018604712233',-1,'TEST',myresult); END; 更详细...
  • ORACLE存储过程使用数组

    千次阅读 2021-07-18 12:46:00
    ORACLE存储过程使用数组@TOC 1 单维数组 --单维数组 DECLARE -- 定义一个数组 TYPE emp_ssn_array IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; -- 声明第一个数组变量 best_employees emp_ssn_array; -- ...
  • oracle存储过程接收自定义数组类型参数 2016年10月29日 09:53:23 ntuloser 阅读数:1092 标签: oraclejava存储mybatis 更多 个人分类: 数据库 版权声明:本文为博主原创文章,未经博主允许不得转载。 ...
  • drop table t;...--存储过程1 绑定变量create or replace procedure proc1asbeginfor i in 1 .. 10000loopexecute immediate'insert into t values ( :x )' using i;end loop;end;/--存储过程2 不使用绑定变...
  • 1前言在程序实现过程中,经常用遇到...2优点2.1执行效率比存储于临时表高,不需要频率存取临时表2.2将全局变量藏于最后防线,安全性较高2.3在视图中可以调用程序包的变量,实现动态视图3实现3.1实现方法概述Oracle数...
  • Oracle变量定义、赋值及使用

    千次阅读 2019-08-02 19:25:00
    以system用户登录:cmdsqlplus system/tigertigeralter user scott identified by "tiger" account unlock;...--学习块的结构--学习定义变量(了解数据类型)及赋值--了解:各种PL/SQL块的类型 --块的结...
  • oracle自定义table在存储过程里面的使

    千次阅读 2017-05-27 15:47:09
    存储过程参数使用自定义table --定义列信息 CREATE OR REPLACE TYPE REP_TYPE_PARAM AS OBJECT (  columnID Varchar2(100),  valueData clob );  --as table of 定义table CREATE OR REPLACE TYPE R
  • 如何定义一个变量v_orgid (结果集或者数组或者集合)来接收查询结果,如下: select org_id into v_orgid from table_A; 进一步,这样接收了数据之后,将 v_orgid 再作为查询条件 例如 这样 select * from table_B ...
  • oracle 批量插入数据存储过程。亲测好用。支持 plsql ,toad,等数据库分析软件。主要包括变量定义,循环及游标的使用等, 亲测好用
  • oracle存储过程单引号拼接和变量拼接 1.单引号的作用:在oracle中单引号主要有两个作用,一是字符串都用单引号引用,例如'abc';二是转义符,转义符在使用时一般会出现多个连在一起的单引号,相对难理解一些。下面...
  • 1.存储过程的参数也可以是默认值,这样当调用该过程时,如果未向参数传入值,则该参数将使用定义的默认值#为JOB_PARAM,HIRE_PARAM和SALARY_PARAM参数设置了默认值,在调用该存储过程时,用户就不必再为这些参数提供...
  • Oracle 存储过程教程

    2020-12-16 03:34:59
    Oracle存储过程中返回记录集,需要用到游标变量Oracle不能像sqlserver那样可以直接返回一个记录集。 由于设想在.net中把复杂的sql语句生成,所以在存储过程中没有去考虑生成sql语句的问题。 以下是在Oracle中...
  • oracle存储过程中游标的使用

    千次阅读 2021-05-03 10:19:43
    定义游标变量3. 使用for循环游标declare-- 定义游标c_jobcursor c_job isselect empno, ename, job, sal from emp where job = 'MANAGER';-- 定义游标变量c_rowc_row c_job%rowtype;begin-- 循环游标,用游标变量c....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 98,914
精华内容 39,565
关键字:

oracle存储过程定义变量

友情链接: custaao629.rar