PL/SQL
function & procedure
packages
function --> arguments or parameters
with arguments,
IN, read only pass values inside the function
eg : select * from emp where empno = IN
OUT : write only, get value from inside the function
eg : select ename into OUT from emp where empno = IN
IN OUT
return varchar2
name of all functions/cursors/procedures/packages/triggers ?
SCOTT USER(or any other user or created by Oracle)
ALL_OBJECTS --> OBJECTS CREATED BY ANY USER
USER_OBJECTS --> OBJECTS CREATED BY THE USER
DBA_OBJECTS --> OBJECTS CREATED BY ORACLE
source or text of function/cursor/procedure/package/trigger?
ALL_SOURCE --> SOURCES OF F/C/P/P/T CREATED BY ALL USER
USER_SOURCE --> SOURCES OF F/C/P/P/T CREATED BY THE USER
DBA_SOURCE --> SOURCES OF F/C/P/P/T CREATED BY ORACLE
procedure --> create or replace procedure p_name is variables
begin
exception
end;
run the procedure :
exec pname()
PL/SQL Block
p_name();
eg : 1. write a procedure to draw a line
for loop
DBMS_OUTPUT.put('-');
NEW_LINE
---------------------
create or replace procedure draw_line
is
begin
for i in 1..40
loop
DBMS_OUTPUT.put('-');
end loop;
DBMS.OUTPUT.NEW_LINE;
end;
/
@draw_line.sql
set serveroutput on
EXEC draw_line;
2. create a procedure to work similar to DBMS_OUTPUT.put_line
eg : exec print('ABC');
create or replace procedure put_line(arg varchar2)
is
begin
DBMS_OUTPUT.put_line(arg);
end;
.
/
PL/SQL program to use Procedure
Declare
a number:= 20;
begin
put_line(a);
put_line('TEST');
end;
or
exec put_line('test');
3. write a procedure to input empno and output emp name and emp job(IN OUT)
input --> empno
output display --> ename, job
emp_no IN number, emp_name OUT varchar2, emp_job OUT varchar2
create or replace function p3(N IN varchar2)
is
name1 varchar2(10);
job1 varchar2(10);
begin
select ename, job into name1, job1
from emp where empno=N;
DBMS_OUTPUT.put_line(name1 || ' ' || job1);
end;
/
exec p3(1234);
method 2 :
create or replace procedure p4(N IN number, name1 OUT varchar2, job1 OUT varchar2)
is
begin
select ename, job into name1, job1 from emp
where empno=N;
end;
/
declare
name12 varchar2(10);
job12 varchar2(10);
begin
p4(1234, name12, job12);
DBMS_OUTPUT.put_line(name12 || ' ' || job12);
end;
4. create a procedure to input empno and output ename for all emp(using cursor and loop)
create or replace procedure p4(N IN number, emp_name OUT varchar2)
is
begin
select ename into emp_name from emp
where empno = N;
end;
/
declare
emp_name1 varchar2(10);
cursor c1 is select empno from emp;
begin
for emp_rec in c1
--no open, fetch, close, exit when
loop
p4(emp_rec.empno, emp_name1);
DBMS_OUTPUT.put_line(emp_rec.empno || ' ' || empname1);
end loop;
end;
note : OUT --> return something from procedure.
PL/SQL program need one variable.
select function_name(parameter) from dual;
eg : select f1(123) from dual;
select p1 from dual;(wrong, procedure may not return something)
note : in PL/SQL program, you can use function and procedure. in SQL*PLUS, you can only use only function.
Package : library(many functions, many procedures)
package_name.function_name(parameter);
package_name.procedure_name(parameter);
eg :
package_name.f1(111);
package_name.p1(111);
eg :
select pakg.f1(111) from dual;(right)
select pakg.p1(111) from dual;(wrong)
exec pakg.p1(111);(right)
to create a package :
1. specification (declare variables, declare functions, declare procedures --> give the name)
2. body (create function, create procedures --> write the full (PL/SQL) function)
eg :
ed pack1.sql -- to store the declaration of package
create or replace package pack1
is
procedure p1; --declare procedure
function f1 return varchar2; --declare function
A number; --declare variable
end pack1; --or end;
ed pakg2.sql -- to store the body of package
create or replace package body pakg1
is
procedure p1 is
begin
DBMS_OUTPUT.put_line('PROCEDURE 1');
end p1; --or end;
function f1 return number is
A number(10);
begin
A:=1234;
return A;
end f1; --or end;
end pakg1; --or end;
to run the package :
select pakg1.f1 from dual;
exec pakg1.p1;
or
declare
N number(10);
begin
N:=pakg1.f1;
DBMS_OUTPUT.put_line(N);
pakg1.p1;
end;
recompile the package :
alter package pack1 compile;
alter package pack2 body compile;
create or replace package pack1
is
declare functions, procedures, variables
end pack1;
create or replace package body pack1
is
function f1() return number
is
...
begin
end f1;
procedure p1(IN OUT)
is
begin
end;
end pack1;
eg : create a package wieh two functions, first fuction to display the name, second function to display the salary.
in both functions input empno.
f1(empno IN, ename OUT)
f2(empno IN, salary OUT)
a) create package spacification
b) create package body
c) execute the package using pL/SQL program
ed p1.sql
create or replace package p1
is
function f1(emp_no IN, emp_name OUT);
function f2(emp_no IN, emp_salary OUT);
end p1;
ed p2.sql
create or replace package p1
is
function f1(emp_no IN, emp_name OUT) return varchar is
emp_name varchar;
begin
select ename into emp_name from emp
where empno=emp_no;
return emp_name;
end f1;
function f2(emp_no IN, emp_salary OUT) return varchar is
emp_salary varchar2;
begin
select salary into emp_salary from emp
where empno=emp_no;
end f2;
end p1;
select p1.f1(1234, emp_name);
select p1.f2(1234, emp_salary);
correction :
ed pack1.sql
create or replace package pack1
is
function get_name(emp_id number)
return varchar2;
function get_salary(emp_id number)
return number;
end pack1;
ed pack2.sql
create or replace package body pack1
is
function get_name(emp_id number)
return varchar2
is
emp_name emp.ename%type;
begin
select ename into emp_name from emp
where empno = emp_id;
return emp_name;
end get_name;
function get_salary(emp_id number)
return number
is
emp_salary emp.sal%type;
begin
select sal into emp_salary from emp
where empno = emp_id;
return emp_salary;
end get_salary;
end pack1;
select pack1.get_name(1234) from dual;
select pack1.get_salary(1234) from dual;
or
declare
v_name emp.ename%type;
v_salary emp.sal%type;
v_emp_id emp.empno%type := &v_emp_id;
begin
v_name:=pack1.get_name(v_emp_id);
v_salary:=pack1.get_salary(v_emp_id);
DBMS_OUTPUT.put_line(v_name||' '|| v_salary);
end;
final exam
1. fill in the blanks
2. true or false
3. what is the result of the following pL/SQL programs
4. explain the following PL/SQL programs
5. match the following
6. short notes
7. write the answer for the following
eg : differences between procedure and function
8. write the PL/SQL programs for the following
PL/SQL的更多相关文章
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...
- PL/SQL循环
1.if循环做判断 SET SERVEROUTPUT ON accept num prompt 'qinshuu'; DECLARE pnum NUMBER :=& num ; BEGIN T ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- PL/SQL连接Oracle数据库,中文乱码,显示问号
问题描述: 登陆PL/SQL,执行SQL语句后,输出的中文标题显示成问号????:条件包含中文,则无数据. 如果不是中文,需要修改注册表值,方法如下: 进入注册表:Win+r,输入re ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- PL/SQL Developer如何连接64位的Oracle图解
在64位Win7系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他 ...
- 每周一书《Oracle 12 c PL(SQL)程序设计终极指南》
本周为大家送出的书是<Oracle 12 c PL(SQL)程序设计终极指南>,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著. 内容简介: <Oracle 12c PL/SQ ...
- pl/sql里的exists和in的差别
项目中有个需要需要如下pl/sql(数据库是MariaDB) ) AS small FROM cmp_ent_main a WHERE createTime<'2016-9-21' ,,) ) ...
随机推荐
- Oracle 遇到的错误及处理整理 - 记录
1. 启动监听提示: TNS-: TNS:permission denied TNS-: TNS:protocol adapter error TNS-: Insufficient privilege ...
- urllib.error.HTTPError: HTTP Error 403: Forbidden
问题: urllib.request.urlopen() 方法经常会被用来打开一个网页的源代码,然后会去分析这个页面源代码,但是对于有的网站使用这种方法时会抛出"HTTP Error 40 ...
- 图像fft和wavelet变换矩阵和向量区别 dwt2和wavedec2联系
1. 对于小波变换,dwt2 :单级离散2维小波变换 wavedec2 :多级2-D小波分解 matlab中这两者联系是都能对图像进行小波分解,区别是dwt2是二维单尺度小波变换,只能对输入矩阵X一 ...
- 项目解析- JspLibrary - part3
CRUD read: String sql = "select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename f ...
- 关于http响应内容压缩的一点小积累。
1.在tomcat的server.xml配置文件中,添加上背景颜色为绿色的配置,服务器就会自动压缩 <Connector port="80" maxHttpHeaderSiz ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 【MYSQL】创建虚表来辅助数据库查询
在进行数据库查询时,有时需要用到对既有的数据表进行多表查询得出的临时条件的数据表,就可以暂时创建成为虚表,并赋予简单明了的字段名以及临时表名. 例题a:查询出每门课程低于平均成绩的学生姓名.课程名称. ...
- iOS App从点击到启动
程序启动之前 从exec()开始 main()函数是整个程序的入口,在程序启动之前,系统会调用exec()函数.在Unix中exec和system的不同在于,system是用shell来调用程序,相当 ...
- 今天同事给介绍了一个LINQ的工具,LINQPad
今天刚知道LINQPad,详细信息参照http://www.linqpad.net/,免费下载,安装之后样子如下所示,根据向导,链接上本地数据库,比较熟悉的操作风格. 对LINQ的了解太浅,还没有更多 ...
- nssm在windows服务器上部署nodejs,coffee启动方式
本想用forever / pm2 来部署nodejs, 百度后发现只能在Linux系统上使用,window上没法使用,兜一圈后又转nssm了.... 在Linux上,可以轻松的使用forever或者p ...