精华内容
下载资源
问答
  • oracle sqlplus存储过程

    千次阅读 2013-07-24 21:37:41
    1、写一个存储过程:可以在Notepad中进行   CREATE OR REPLACE PROCEDURE skeleton  IS  BEGIN  NULL;  END;  把文件存为skeleton.sql. ==========解释一下===========  让我们一...

    1、写一个存储过程:可以在Notepad中进行

     

    CREATE OR REPLACE PROCEDURE skeleton
      IS
      BEGIN
      NULL;
      END;

     把文件存为skeleton.sql.

    ==========解释一下===========

     让我们一行行遍历这个存储过程:
      1 CREATE OR REPLACE PROCEDURE skeleton
      2 IS
      3 BEGIN
      4 NULL;
      5 END;
      行1:CREATE OR REPLACE PROCEDURE 通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;
      行2:IS关键词表明后面将跟随一个PL/SQL体。
      行3:BEGIN关键词表明PL/SQL体的开始。
      行4:NULL PL/SQL语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
      行5:END关键词表明PL/SQL体的结束

     

     

    2、创建一个存储过程
      SQL语句CREATE OR REPLACE PROCEDURE在Oracle数据库中创建、编译和保存一个存储过程。
      从Window打开SQL*Plus并且从SQL*Plus登录到你的数据库;打开skeleton.sql文件.
      在SQL>命令提示符下输入以下命令:

       SQL>@skeleton
      SQL>/

       SQL*Plus装载skeleton.sql文件的内容到SQL*Plus缓冲区并且执行SQL*Plus语句;SQL*Plus 会通知你存储过程已经被成功地创建。
     现在你的存储过程被创建,编译和保存在你的Oracle数据库,我们可以运行它。

    3、运行存储过程

      从SQL*Plus 命令行提示符运行你的存储过程使用EXECUTE命令,如下:

         SQL> EXECUTE skeleton;

          SQL*Plus 输出一下信息确信存储过程成功执行: PL/SQL procedure successfully completed.


      你也可以在一个无名PL/SQL块内运行你的存储过程,在SQL*Plus命令提示符下,它看起来像:

       SQL> BEGIN
      2 SKELETON;
      3 END;
      4 /

       

    4、修改存储过程
      让我们写一个输出字符串“Hello World!”的存储过程,用Notepad打开你的skeleton.sql 文件,. 用DBMS_OUTPUT.PUT_LINE 过程调用去替换NULL语句,如下所示:

    CREATE OR REPLACE PROCEDURE skeleton
      IS
      BEGIN
      DBMS_OUTPUT.PUT_LINE(’Hello World!’);
      END;
      保存到文件skeleton.sql.

    SQL*Plus命令行打开文件skeleton.sql .
      SQL> @skeleton
      SQL>
      1 CREATE OR REPLACE PROCEDURE skeleton
      2 IS
      3 BEGIN
      4 DBMS_OUTPUT.PUT_LINE(’Hello World!’);
      5* END;
      SQL> /
    SQL*Plus 
    通知你存储过程成功创建并输出提示信息:Procedure created.

    EXECUTE 命令运行你的存储过程:
      SQL> EXECUTE skeleton;
    SQL*Plus
    显示存储过程运行成功:PL/SQL procedure successfully completed.

    我们想要的输出字符串 “Hello World!”没有出来,在显示一个DBMS_OUTPUT.PUT_LINE 结果前需要运行一个SET命令,在SQL*Plus 命令行提示符,键入:
      SQL> SET SERVEROUTPUT ON
    再次执行你的存储过程:
      SQL> EXECUTE skeleton;
    现在结果输出了:Hello World!
      PL/SQL procedure successfully completed.

     

    5、调试

      当调试一个存储过程时,遵循一样的步骤,修改SQL文件,创建存储过程,执行存储过程,根据编译器反馈的出错信息进行修改,这一步是非常繁琐的,需要依靠经验。
      在实际的商用存储过程的开发调试过程中,由于涉及很多表、类型、光标、循环、条件等复杂的逻辑,和PL/SQL语句的灵活运用,编译时会产生很多错误提示信息,程序员在根据这些错误信息定位,进行修正,再编译最后得到正确的结构;

     

    6、删除


      如果在数据库中你不在需要一个存储过程你可以删除它,SQL语句 DROP PROCEDURE 完成从数据库中删除一个存储过程,DROP PROCEDURE 在SQL中被归类为数据定义语言(DDL) 类操作,其他的例子有CREATE, ALTER, RENAME 和TRUNCATE。.
      在SQL*Plus 命令提示符下,使用DROP PROCEDURE SQL 语句删除你的叫做skeleton的存储过程:

      SQL> DROP PROCEDURE skeleton;
      SQL*Plus assures us the procedure has been removed:
      Procedure dropped.
       
      总结
      本文详细讨论了如何使用Oracle工具开发Oracle商用存储过程的步骤。最后在存储过程的使用中可能是程序直接调用,也可能被触发器调用。


    --------------------------------------

    另外,据说存储过程修改后,在很小的概率下,不会马上被重新编译,会在缓存里保存过时的版本,所以最好是改完,强制编译一下。

    ALTER PROCEDURE procedure_name COMPILE 编译存储过程

    ========================

     

     

    展开全文
  • SQLPLUS编译存储过程见鬼记2010-12-24最近逛天涯,看到了一个帖子,里面有灵异事件的内容,虽然不太相信,但因为无法解释,也让人毛骨悚然。没想到,今天使用SQLPLUS编译存储过程竟然也“见鬼”了,而且这个“鬼”很...
    SQLPLUS编译存储过程见鬼记
    2010-12-24

    最近逛天涯,看到了一个帖子,里面有灵异事件的内容,虽然不太相信,但因为无法解释,也让人毛骨悚然。没想到,今天使用SQLPLUS编译存储过程竟然也“见鬼”了,而且这个“鬼”很有意思,于是记录下来。

    SQL> set line 120
    SQL> set pagesize 9999
    SQL> set time on

    把待编译的含存储过程的文件载入编辑缓存。为了凸显问题部分,已经去掉了函数中不涉及错误的若干行代码。
    10:58:54 SQL> get a.sql
      1  create or replace
      2  function remove_constants( p_query in varchar2 )
      3  return varchar2
      4  as
      5     l_query long;
      6     l_char varchar2(1);
      7     l_in_quotes boolean default FALSE;
      8  begin
      9     l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
     10     for i in 0 .. 8
     11     loop
     12     l_query := replace( l_query, lpad('@',10‐i,'@'), '@' );
     13     l_query := replace( l_query, lpad(' ',10‐i,' '), ' ' );
     14     end loop;
     15     return upper(l_query);
     16* end;
    10:58:57  17
    10:59:02 SQL> l
      1  create or replace
      2  function remove_constants( p_query in varchar2 )
      3  return varchar2
      4  as
      5     l_query long;
      6     l_char varchar2(1);
      7     l_in_quotes boolean default FALSE;
      8  begin
      9     l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
     10     for i in 0 .. 8
     11     loop
     12     l_query := replace( l_query, lpad('@',10‐i,'@'), '@' );
     13     l_query := replace( l_query, lpad(' ',10‐i,' '), ' ' );
     14     end loop;
     15     return upper(l_query);
     16* end;
    10:59:06 SQL> /

    Warning: Function created with compilation errors.
    #^ 编译出错。

    10:59:12 SQL> show err
    Errors for FUNCTION REMOVE_CONSTANTS:

    LINE/COL
    ---------------------------------------------------------------------------------
    ERROR
    ------------------------------------------------------------------------------------------------------------------------
    11/42
    PLS-00103: Encountered the symbol "?" when expecting one of the following:

       ) , * & | = - + < / > at in is mod remainder not rem => ..
       <> or != or ~= >= <= <> and or like LIKE2_
       LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
    #^ 编译器声称在11行42列遇到了不合法符号问号“?”
    10:59:14 SQL> l 11
     11*    loop
    11:01:44 SQL>
    #^ 问题是11行总共才一个单词"loop".
    #^ 而且,整个文件中也没有什么问号呀!

    在EMDC-方案-程序-函数中查看我们的函数remove_constants,发现了端倪:
    ( p_query in varchar2 )
    return varchar2
    as
        l_query long;
        l_char varchar2(1);
        l_in_quotes boolean default FALSE;
    begin
        l_query := translate( l_query, '0123456789', '@@@@@@@@@@' );
        for i in 0 .. 8
        loop
        l_query := replace( l_query, lpad('@',10?\i,'@'), '@' );
        l_query := replace( l_query, lpad(' ',10?\i,' '), ' ' );
        end loop;
        return upper(l_query);
    end;

    可以看到,loop后面两行中确实显示有问号!!!
    本来的文本应该是“10-i”,而在EMDC中显示的是“10?\i”。真是怪异!

    回想一下,我们的编译环境是WINXP+ULTRAEDIT和SQLPLUS,而存储过程的驻留位置在CENTOS系统的DB上,那么是不是这二者在字符集差异方面的问题呢?

    先看一下,我们的“10-i”在ULTRAEDIT下究竟存储成什么。
    使用ULTRAEDIT的"Hex Edit"功能,同时显示二进制表示和文本表示,定位到“10-i”的位置,有了惊人的发现。由于直接拷贝黏贴过来,看不到二进制显示形式,只有转录。
    选中文本显示中“10-i”的部分,对应的二进制显示部分选中的内容为:
    31 30 A9 5C 69


    11:41:09 SQL> select chr(169) from dual;

    C
    -
    ?

    11:41:37 SQL> select chr(92) from dual;

    C
    -
    \

    11:51:37 SQL> select chr(105) from dual;

    C
    -
    i

    11:55:37 SQL>
    #^ 使用数据库的chr函数,可以验证在“数据库字符集”下,0xa9,0x5c,0x69对应的字符分别为"?","\","i".

    现在,终于可以解释这个“鬼”的来历了。最初,存储过程文本从pdf文件中拷贝过来时,原pdf文件中显示的“10-i”在复制过来后,由于pdf文件编码的问题,这个“10-i”实际上已经变异成了“10?\i”,被复制到ULTRAEDIT中。

    与其他复制过程中“变异”的字符不同,其他的变异字符在ULTRAEDIT中可以直观的看到变异,从而被修正,而变异成“10?\i”的字符在ULTRAEDIT中仍然显示成正确的“10-i”,于是底层的编码仍然是变异后的31 30 A9 6C 69,而没有被修改成正确的31 30 2D 69。

    这一看不到的编码错误被读入了SQLPLUS的编辑区,而SQLPLUS竟然同样肉眼凡胎,没有识别出错误编码的真面目(难道是WINDOWS的特色?)。再由PLSQL模块编译时,由于这一错误的编码代表的字符串不符合PLSQL语法,因而产生编译错误,“鬼”开始作弄人了。

    总结:其实除了这次,以前在工作中也不止一次的遇到怪异的,按常理无法解释的事件。与生活中的科学无法解释的灵异事件不同,经过仔细分析和研究之后,发现这些技术上的怪异事件背后都有它非常常规的原因和解释。因此,见怪不怪,透过现象看本质,应该是技术人员应该具备的态度吧。

    来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24131851/viewspace-682555/,如需转载,请注明出处,否则将追究法律责任。

    转载于:http://blog.itpub.net/24131851/viewspace-682555/

    展开全文
  • 2.红色字根据具体情况进行修改; 3.此脚本可以将procedure、function备份成一个可直接执行的脚本;[/b] /***********本人原创,欢迎转载,转载请保留本人信息*************/ 作者:wallimn 电邮:wallimn@sohu....
    set echo off
    
    set newpage none
    set feedback off
    set linesize 2500
    set heading off
    set pagesize 0
    set termout off
    set trimout on
    set trimspool on
    col procline for a2000
    spool [color=red][b]c:\procbak2.sql[/b][/color]
    select decode(rn,1 , 'create or replace ','')||text||decode(rn,cnt,chr(13)||chr(10)||'/'||chr(13)||chr(10),'') procline
    from (select row_number() over(partition by name order by line) rn,
    count(*) over(partition by name) cnt,
    rtrim(text) text from all_source where owner='[color=red][b]JXC2[/b][/color]')
    ;
    spool off

    [b]注:
    1.上面文件存成一个文件,然后用@执行即可;
    2.红色字根据具体情况进行修改;
    3.此脚本可以将procedure、function备份成一个可直接执行的脚本;[/b]
    /***********本人原创,欢迎转载,转载请保留本人信息*************/
    作者:wallimn 电邮:wallimn@sohu.com 时间:2009-10-06
    博客:http://wallimn.iteye.com
    网络硬盘:http://wallimn.ys168.com
    /***********文章发表请与本人联系,作者保留所有权利*************/
    展开全文
  • sqlplus ( < username > [/ < password > ][@ < connect_identifier > ] | /) [AS SYSDBA | AS SYSOPER] | /NOLOG SQL> desc user_source; [b]--查看:[/b] SQL> select TEXT from user...
    --登录:
    
    > sqlplus ( < username > [/ < password > ][@ < connect_identifier > ] | /) [AS SYSDBA | AS SYSOPER] | /NOLOG
    SQL> desc user_source;
    [b]--查看:[/b]
    SQL> select TEXT from user_source where TYPE ='PROCEDURE' and NAME = 'Your_Procedure_name' ;
    --执行:
    SQL> var out_var number
    exec Your_Procedure_name ( '' , '' , '' ,:out_var)
    print out_var

    [b]--编译:[/b]
    alter procedure procedure_name compile;

    [b]--重新编译所有invalid存储过程:[/b]
    spool ExecCompProc.sql
    select 'alter procedure '||object_name||' compile;' From all_objects where status = 'INVALID' and object_type = 'PROCEDURE';
    spool off
    @ExecCompProc.Sql;

    整理成一个存储过程
    Create Or Replace Procedure Zl_Compile_Invalid_Procedure As
    Strsql Varchar2(200);
    Begin
    For x In (Select Object_Name From All_Objects Where Status = 'INVALID' And Object_Type = 'PROCEDURE') Loop
    Strsql := 'Alter Procedure ' || x.Object_Name || ' Compile';
    Begin
    Execute Immediate Strsql;
    Exception
    --When Others Then Null;
    When OTHERS Then dbms_output.put_line(Sqlerrm);
    End;
    End Loop;
    End;

    执行
    exec Zl_Compile_Invalid_Procedure;
    如果要看到无法重编译的过程的出错信息,需要执行前设置set serverout on
    展开全文
  • sqlplus 导出导入 存储过程,包体

    千次阅读 2016-05-11 16:05:03
    sqlplus 导出导入 存储过程,包体; 先查看user_source 有哪些内容 select type from user_source group by type; TYPE BODY PROCEDURE FUNCTION TYPE PACKAGE BODY PACKAGE 开始导数 set echo off ; set ...
  • 提示符下输入存储过程的内容,然后执行/ 即可编译存储过程 如果提示编译出错,则执行show error,可以看到错误的...然后执行edit进入命令行缓冲,根据提示修改存储过程修改完毕,键入:x保存 然后再执行/ 重新编...
  • SQLPLUS中创建、运行、调试、查看、修改和删除存储过程2011年03月11日 星期五 16:01平时基本上都是用PL/SQL DEVELOPER对ORACLE进行操作,突然有一天没有PL/SQL DEVELOPER可以用 了,惨了,不会操作了,经常有这么...
  • SQLPLUS中创建、运行、调试、查看、修改和删除存储过程 2011年03月11日 星期五 16:01 平时基本上都是用PL/SQL DEVELOPER对ORACLE进行操作,突然有一天没有PL/SQL DEVELOPER可以用了,惨了,不会操作了...
  • #3、运行存储过程,从临时表处理至中间表 完整的shell代码查看文件: http://download.csdn.net/detail/missmyhome/8175865
  • oracle存储过程简介存储过程,它是一个有名字的plsql代码块创建之后会保存到数据库中当数据库启动时,会自动加载到数据库内存中,执行效率高存储过程有参数,没有返回值,但是有输出参数创建存储过程的创建语法create [or...
  • 存储过程

    2018-10-11 09:13:32
    存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数...
  • Oracle 存储过程学习 目录 Oracle 存储过程.............................................................................................................................. 1 Oracle 存储过程基础知识........
  • MySQL存储过程中的3种循环,存储过程的基本语法,ORACLE与MYSQL的存储过程/函数的使用区别,退出存储过程方法   在MySQL存储过程的语句中有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准...
  • Oracle 存储过程

    2014-03-03 14:15:41
    存储过程的优点: 1 SQL存储过程执行起来比SQL命令文本快得多。 当一个SQL语句包含在存储过程中时,服务器不必每次执行它时都要分析和编译它。 2 调用存储过程,可以认为是一个三层结构。 程序易于维护。...
  • 1.存储过程和存储函数:是指存储在数据库中供所有用户调用的子...存储过程和存储函数的不同点:是否能用 return 语句返回值,存储过程不能使用return语句,存储方法可以使用return语句; 2.存储过程结构: create
  • oracle存储过程

    2014-03-19 17:31:07
    oracle存储过程的作用:  1.存储过程可以使得程序执行效率更高、安全性更好,因为过程建立之后 已经编译并且储存到数据库,直接写sql就需要先分析再执行因此过程效率更 高,直接写sql语句会带来安全性问题,如:...
  • 第一章 oracle存储过程概述 2 1.1 存储过程基本结构(PROCEDURE) 3 1.1.1创建存储过程 3 1.1.2 存储过程删除 5 1.1.3 调用存储过程 5 1.2存储函数(FUNCTIONE) 6 1.2.1 创建存储函数 6 1.2.2 删除存储函数 7 1.3 包...
  • sqlplus

    2016-01-07 17:41:28
    列出函数及存储过程的定义 sys @ PROD> desc scott.emp Name Null? Type ----------------------------------------------------- -------- ------------------------------------ EMPNO NOT NULL NUMBER...
  • oracle存储过程练习

    2018-08-05 19:35:58
    创建一个简单的存储过程update_emp,该过程用于将emp表中empno为6500的员工的姓名修改为CANDY -----创建存储过程update_emp create procedure update_emp as begin update emp set ENAME='CANDY'where empno='...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,343
精华内容 5,337
关键字:

sqlplus修改存储过程