/*
* chap 02
* -------------------------------------------------
*/ --
create or replace function wordcount(str in varchar2)
return pls_integer
as
words pls_integer := 0;
len pls_integer := nvl(length(str), 0);
inside_a_word boolean;
begin
for i in 1..len + 1
loop
if ascii(substr(str, i, 1)) < 33 or i > len
then
if inside_a_word
then
words := words + 1;
inside_a_word := false;
end if;
else
inside_a_word := true;
end if;
end;
/
show error;
create function wordcount(str in varchar2)
return pls_integer
as
declare local variables here
-- 注意, 这里直接就可以声明了, 不需要在使用declare 声明了+
-- declare 声明, 是针对独立的pl/sql块的
begin
implement algorithm here
exception
exception execute
end;
/

Create Function

2.1 在数据库中导航

  意思是在数据库中找到对象, 例如表, 索引等等, 这里强烈推荐使用IDE 来进行导航, 例如使用 TOAD.

2.2 创建和编辑源代码

  根据个人喜好不同, 有人喜欢使用 IDE, 如 TOAD, 而还有些人喜欢朴素的编辑器, vi 或者 sqlplus 等

2.3 sql * plus

  启动sqlplus, 远程时, 需要加上 connect bob/asdf@hqhr.word 这里的 hqhr.word 是连接标示符, 实际上就是 tnsnames.ora 里的那个标示符

  在 sqlplus 中运行 pl/sql 代码, 需要再最后加上一个 '/', '/' 这个斜杠不属于 plsql 语法也不属于sql语法, 它是 sqlplus 特有的.

  另外, 如果你想显示输出内容, 要设置 SET SERVEROUTPUT ON

  可以通过, exec 命令来执行 plsql 程序.

  运行脚本, @ abc.pkg , start 步骤: ( 此时 abc.pkg 必须在当前目录下, 或者在 SQLPATH 指定目录下 )

  1. 打开叫 abc.pkg 文件.

  2. 尝试顺序执行这个文件中所有的命令, 包括 sql, pl/sql, sqlplus 的命令.

  3. 当所有命令都完成后, 关闭文件, 并返回到 sqlplus 提示符下. ( set echo on 可以不仅看到执行结果, 还可以看到脚本内容 )

  个性化设置

  show all 显示所有设置

  

1. 执行sql脚本时, 文件路径:

a : 放置在当前目录下

b : 放置在SQLPATH 指定的目录下.

c : 绝对路径执行. @ /u01/app/oracle/sqlscript/a.sql

2. 显示脚本中的内容, set echo on 在运行脚本前, 显示脚本内容.

3. 当一个脚本中, 又调用了其他脚本:

要在调用其他脚本前加 @@ 注意是两个, 例如脚本

REM Filename:" abc.pkg

@@abc.pks

@@abc.pkb

@@ 两个的含义是, “假设这两个文件的路径就是当前路径, 所以这两个文件要放在当前路径下” 即 abc.pkg, abc.pks, abc.pkb要在同一个路径下.

4. 变量

sqlplus  支持两种各自独立的变量类型:

 特殊变量: 在 sql 环境下, define x = “the answer is 42”, select ‘&x’ from dual; 注意: 使用时要 + & 和 '&x' 有两个单引号

绑定变量: 在 sql 环境下, variable x varchar2(10) begin :x := ‘hello’; END; / pirnt :x 注意: 绑定变量前还有赋值语句前都要有 :

  select :x, &x from dual;    可以看到, 这两个变量是同名, 但是完全独立, 因为引用时分别加了 : 和 &

define 这种变量, 我们很少使用

variable 定义的这种变量, 与 declare 定义的变量的区别是, variable 定义的变量可以看做是全局变量(绑定变量), 而 declare 定义的变量是局部变量(block变量)

区别参考如下代码:

-- var 变量
-- sql 提示符下 var x varchar2(10);
begin
:x := 'hello';
end;
/ -- 执行成功后, 你可以此用户的sql下, 执行
print :x; -- 能够输出 hello -- declare 变量
-- sql 提示符下 declare x varchar2(10);
begin
:x := 'world';
end;
/ print :y; -- 此时, 会得到错误信息, 没有这个 :y -- 综上, var 是全局变量, 定义后, 即便是跳出了定义时的那个block, 变量仍然存在,
-- 但是, declare 定义的变量, 就只在跟它关联的那个 block 中有作用, 跳出那个block以后, 就不存在了.

输出保存到文件

spool report

@ run_report

spool off

spool 默认的扩展名是 report.lst, 当然你可以不适用默认扩展名, 例如 spool report.txt

退出sqlplus

  1. exit, 会退出sqlplus, 退回到操作系统界面.

  2. disconnect, 退回到 sqlplus /nolog 状态. 退出数据库而没有退出 sqlplus

编辑语句

  sqlplus 会在缓存中保留最后执行的语句, 你可以使用内置的行编辑器或者任何外部编辑器来修改这条语句,

  使用 EDIT 命令会让 SQLPLUS 把当前命令缓存中的内容保存到一个文件, 然后暂停 sqlplus, 然后调用编辑器

  一旦你保存文件并退出编辑器, sql*plus 会把编辑后的最新文件读到缓存中, 然后sqlplus 会话继续.

  果然, 经过测试, 即便是一条查询语句, 都可以调用 edit 来进行处理, 处理完保存后, 直接 / 执行, 就可以看到编辑后的效果, 非常方便.

  可以通过 DEFINE _EDITOR = /bin/vi 来修改默认编辑器

  另外也可以在sqlplus 命令行本身来修改, 常用的命令有 L, N, DEL, C/OLD/NEW/, N TEXT( 将text 内容替换第 n 行), I 等等.

5. sql*plus 环境加载

a. 首先执行 $ORACLE_HOME/sqlplus/admin/glogin.sql 脚本, 注意这是一个全局脚本, 换句话说, 如果你的服务器有多人维护, 那么修改这个脚本的内容, 修改习惯, 那么就别人也跟同一期修改.

b. 接下来, sql*plus会执行当前目录下的login.sql脚本, 如果有这个脚本的话, 同样可以包含一些设置命令.

作者的 sqlplus 习惯, login.sql中的配置( 后一个文件 )

  SET PAGESIZE 999

  SET LINESIZE 132

  SET SERVEROUTPUT ON SIZE UNLIMITED FORMAT WRAPPED

  DEFINE _EDITOR = /usr/local/bin/vim

  COLUMN segment_name FORMAT A30 WORD_WRAP

  COLUMN object_name FORMAT A30 WORD_WRAP

  SET SQLPROMPT "_USR'@'_CONNECT_IDENTIFIER > "

  我经常使用的习惯

set pageszie 13

set newpage 0

set linesize 120

set feedback on

set serveroutput on

define _EDITOR = /usr/bin/vim

set sqlprompt “_user’@’ _connect_identifier>”

6. SQL*PLUS 遇到错误时

如果 sqlplus 中遇到了一个 sql 或者 pl/ssql 错误, 缺省行为时 报告这个错误然后继续处理, 在交互模式下, 这种处理是很理想的, 但是如果运行的是一个脚本, 很多时候我们更希望出现错误后中止 sqlplus 运行, 我们可以通过设置一下命令, whenever sqlerror exit sql.sqlcode , 这样, 当sqlplus 遇到错误后, 就会中止. 这个命令的另一种写法是, whenever sqlerror sql.sqlcode exit rollback, 这样还会回滚错误之前提交的内容.

以上两个指令, 直接在SQL 提示符下输入即可

sqlplus 另外特性

  使用sqlplus, 可以执行批处理脚本, 另外还可以将参数从脚本中传递过去, &1( 第一个参数), &2 (第二个参数 )

7. show errors 显示错误的内容

show errors 一般形式 ( 一般只使用这种形式就可以了 )

 也可以具体一点, show errors category [schema.]object, 例如: show errors function wordcount( function 是 category, wordcount 是 object )

习惯上, 在创建Procedure最后面加上 show errors, 即 / 这个后面 ( 一般不使用 set echo on, 只有在特殊需要向看source时才设置 )

存储过程的执行, 显示, 授权和别名, 删除及隐藏存储过程源代码

exec 可以执行存储过程,

调用函数方法( 也是存储过程 )
   可以使用 call 来调用函数

variable words number

call wordcount('some text') into :words;

call wordcount@remote_link_name('some text') into :words  // 调用远程数据库的函数

显示存储过程

select * from user_objects, 首先找到存储过程的名称, 然后使用 desc wordcount 来显示存储过程

授权和别名

grant execute on wordcount to scott;

revoke execute on wordcount from scott;

grant execute on wordcount to all_mis;  // 授权给一个角色, grant execute on wordcount to public;  // 所有用户都可以访问

当你授权时, 数据库会牢记你的授权, 比如你授权给一个用户 scott, 同时又授权了 scott所在的角色(可能很多人有这个角色), 然后又授权给了public, 那么当你收回权限是, 也要做 3 次收回, 即从 public 收回, 从角色收回, 从 scott 用户收回.

另外, 当用户执行别人的存储过程时, 最好再自己内部创建一个别名来引用, 因为这样, 当属主变了时, 只需要改变别名, 不需要更改其他内容.

删除存储过程

drop function wordcount;

drop package pkgname;

drop package body pkgname;

另外, oracle 提供了一个叫 wrap 的工具, 可以将你编辑的 pl/sql 代码加密.

IDE : toad, 推荐

pl/sql programming 02 创建并运行plsql代码的更多相关文章

  1. pl/sql programming 03 语言基础

    PL/SQL 块结构 最小的有意义的代码单元叫做 块(block). 一个块是一组代码, 这个块给出了执行边界, 也为变量声明和异常处理提供了作用范围, pl/sql 准许我们创建匿名块和命名块, 命 ...

  2. pl/sql programming 15 数据提取

    数据提取 -- 游标 游标只是一个指向某个结果集的指针. 声明游标: cursor employee_cur IS select * from employees; 打开游标: open employ ...

  3. pl/sql programming 06 异常处理

    如果 PLSQL发生了错误, 无论是系统错误还是应用错误, 都会抛出一个异常, 当前 PL/SQL 块中执行单元会暂停处理, 如果当前块有一个异常处理单元的话, 控制会转移到当前块的异常处理单元来处理 ...

  4. [SQL Server]无法创建 SSIS 运行时对象,请验证 DTS.dll 是否可用及是否已注册

    很大可能是SQL Server Management Studio(SSMS)版本与当前操作系统不兼容造成的,与数据库本身没有关系,这种情况基本无解,不过可以使用其他机器连本机数据库导入导出数据. 今 ...

  5. pl/sql programming 05 循环迭代处理

    使用循环应考虑的因素 1. 循环什么时候结束 2. 什么时候测试是否该结束循环 3. 采用这种循环的原因 1. 普通循环(简单循环) 使用场合, 不能确定循环执行多少次, 要求循环至少执行一次. 另外 ...

  6. 【PL/SQL】设置F8自动运行

  7. ORACLE PL/SQL编程详解

    ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...

  8. 在SQL中使用PL/SQL函数存在的问题

    -----------------------------Cryking原创------------------------------ -----------------------转载请注明出处, ...

  9. oracle pl/sql 分页

    一.无返回值的存储过程 古人云:欲速则不达,为了让大家伙比较容易接受分页过程编写,我还是从简单到复杂,循序渐进的给大家讲解.首先是掌握最简单的存储过程,无返回值的存储过程. 案例:现有一张表book, ...

随机推荐

  1. 【转载】在程序中动态改变static text控件的caption值

    方法1,给STATIC控件取个名字叫IDC_STATICTITLE 然后在ClassWizard中设定一个控件变量给它叫m_statictitle 然后用m_statictitle.SetWindow ...

  2. NGP处理包

    NGP处理部分(主要就是这个RunOnce函数,客户单肯定是开个线程取调用这个RunOnce的) void NGP::RunOnce() { m_spTimerFac->driveTimer() ...

  3. Hibernate SQL方言 (hibernate.dialect)

    数据库 hibernate方言 DB2 org.hibernate.dialect.DB2Dialect DB2 AS/400 org.hibernate.dialect.DB2400Dialect ...

  4. 常量折叠 const folding

    http://bbs.byr.cn/#!article/CPP/86336?p=1 下列代码给出输出结果: #include"stdafx.h" #include <iost ...

  5. 微信电脑版也能用公众号自定义菜单 微信1.2 for Windows发布

    昨日,微信电脑版发布更新,版本为微信1.2 for Windows,最大的特色就是加入了保存聊天记录功能,可以使用公账号菜单,手机上收藏的表情也能在电脑版上发送,可以接收转账消息. 本次微信pc版更新 ...

  6. 高德地图根据经纬度转换成地址JS代码demo

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  7. (转)单机上配置hadoop

    哈哈,几天连续收到百度两次电话,均是利好消息,于是乎不知不觉的自己的工作效率也提高了,几天折腾了好久终于在单机上配置好了hadoop,然后也成功的运行了一个用例,耶耶耶耶耶耶. 转自:http://w ...

  8. 单选项框RadioGroup的综合应用

    大家好,我们今天这一节要介绍的是RadioGroup 的组事件.RadioGroup 可将各自不同的RadioButton ,设限于同一个Radio 按钮组,同一个RadioGroup 组里的按钮,只 ...

  9. struts.properties的参数描述

    A.2.1 概述 如果我们希望覆盖在default.properties文件里面定义的默认配置,那就可以定义struts.properties文件,在里面设置我们需要的值,当然现在也可以在struts ...

  10. Xamarin for Visual Studio 3.11.666 稳定版 破解补丁 Version 3

    前提概要 1.全新安装请参考 安装 Xamarin for Visual Studio. 2.本次补丁包含: ① Xamarin for Visual Studio 3.11.666 ② Xamari ...