【Oracle】第14天 PL/SQL编程基础

本文详细介绍了PL/SQL的基础知识,包括语法框架、变量与常量的定义、数据类型、输入输出操作及代码块的使用等核心内容。通过具体实例展示了如何在PL/SQL环境中进行数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

语法框架

DECLARE 
	声明部分
BEGIN
	代码块
EXCEPTION
	异常处理
END;

变量与常量

变量语法:

变量名 数据类型[:=初始值]

补充:标识符命名规范
1)对象名可以有数字和特殊字符
2)长度不能超过30个字符
3)不能用数字开头
4)尽量不用关键字作为标识符

输出语句

DBMS_OUTPUT.PUT(字符串)
DBMS_OUTPUT.PUT_LINE(字符串)--输出后换行
DBMS_OUTPUT.NEW_LINE()--换行

赋值符号 “:=”

举例:

DECLARE 
	V VARCHAR2(30):='Oracle';
BEGIN
	DBMS_OUTPUT.PUT_LINE(V);
	V:='PL/SQL';
END;

→选中执行→output标签

常量语法

不可修改,在声明时必须包含常量名

常量名 CONSTANT 数据类型[:=常量值]

举例:

DECLARE 
	V CONSTANT VARCHAR2(30):='Oracle';
BEGIN
	DBMS_OUTPUT.PUT_LINE(V);
END;

输入语句:&

SELECT * FROM EMP WHERE DEPTNO =&部门编号;


执行之后出来对话框让你填写,你填写10号或20号之后就可以随你填写的内容条件执行(sqlplus同样适用)

  • 输入数值:&变量名
  • 输入字符串:‘&变量名’

PL/SQL的COMMAND WINDOW 与SQLPLUS一样

举例:

DECLARE 
	V VARCHAR2(30):='&变量值';
BEGIN
	DBMS_OUTPUT.PUT_LINE(V);
END;

SELECT INTO 语句

SELECT 列名,列名... INTO 变量,变量... FROM 表名 ;

注意:
SELECT INTO 语句每次只能查询一条数据,不能多不能少

数据类型

基础类型

NUMBER(38,1)

INTEGER

PLS_INTEGER

BINARY_INTEGER

FLOAT:浮点型(小数类型)

数据精度要求特别高时,改用VARCHAR2

VARCHAR2(4000) 最大4000个英文字符

CHAR(2000)

LONG 可以存放2g的内容,但是不建议使用

CLOB 存放大文本,当字符串使用
BLOB 存放大文件

DATE和TIMESTAMP区别在于精度

SELECT SYSDATE FROM DUAL;
SELECT LOCALIMESTAMP FROM DUAL;

BOOLEAN: 只有三个值:
TRUE/FALSE/NULL

复杂类型

记录类型变量RECORD

有多个属性,一个属性对应一个值,可以存放多个值

TYPE 类型名称 IS RECORD(
	属性名 数据类型,
	属性名 数据类型,
...)

举例:

DECLARE 
	TYPE  MTYPE IS RECORD(
	NAME VARRCHAR2(30),
	JOB VARCHAR2(50),
	SAL NUMBER(5)
	);
BEGIN;
END;

注意:记录类型变量不能直接打印,应该取其中一个属性打印

举例:查询7369的姓名,职位和工资

法一:

DECLARE 
	V_ENAME VARCHAR2(20);
	V_JOB VARCHAR2(30);
	V-SAL NUMBER(5);
	
BEGIN
	SELECT ENAME,JOB,SAL INTO V_NAME,V_JOB,V_SAL FROM EMP WHERE EMPNO=7369;
	DBMS_OUTPUT.PUT_LINE (V_ENAME);
	DBMS_OUTPUT.PUT_LINE(V_JOB);
	DBMS_OUTPUT.PUT_LINE(V_SAL);
END;

法二:
使用记录类型变量完成以上要求:

DECLARE 
	TYPE MTYPE IS RECORD (
	V_ENAME VARCHAR2(20);
	V_JOB VARCHAR2(30);
	V_SAL NUMBER(5);
	);
BEGIN
	SELECT ENAME,JOB,SAL INTO V FROM EMP WHERE EMPNO=7369;
	DBMS_OUTPUT.PUT_LINE (V.ENAME);
	DBMS_OUTPUT.PUT_LINE(V.JOB);
	DBMS_OUTPUT.PUT_LINE(V.SAL);
END;

&TYPE类型

%TYPE类型,取其他变量的类型,作为指定变量的类型

举例:
EMP.JOB%TYPE --取EMP 表的JOB列的单一的数据类型,作为一个新的类型

DECLARE
	V EMP.JOB%TYPE;
	N1 NUNBER(10) ;
	N2 N1%TYPE;
BEGIN;
END;

%ROWTYPE 类型

%ROWTYPE类型是%TYPE类型和记录类型的结合

举例:
写一个代码块,输入一个员工编号,查询并打印员工的信息

DECLARE 
	V EMP%ROWTYPE;
BEGIN
	SELECT * INTO V FROM EMP WHERE EMPNO=&ENO;
	DBMS_OUTPUT.PUT_LINE(V.ENAME||','||V.JOB||','||V.MGR||','||V.HIREDATE||','||V.SAL||','||V.COMM||','||V.DEPTNO);
END;

代码块部分详解

组成元素

1.SELECT INTO 语句
2.INSERT/UPDATE/DELETE 语句
3.EXECUTE IMMEDIATE 执行

语法:

EXECUTE IMMEDIATE SQL语句(字符串类型) [INTO 变量] [USING,...]

解释:
其中INTO 子句和SELECT INTO 中的一样:用于将SELECT 查询结果保存在变量中,USING 子句给SQL语句传递参数

DECLARE 
BEGIN
	EXECUTE IMMEDIATE 'UPDATE EMP SET SAL = SAL+500';
	EXECUTE IMMEDIATE 'SELECT ENAME FROM EMP WHERE EMPNO=7369' INTO V_NAME ;
	DBMS_OUTPUT.PUT_LINE(V_ENAME);
END;

注意:
DDL语句只可以放在EXECUTE IMMEDIATE 语句中运行

举例:

DECLARE 
	V_EMPNO NUMBER(11):=7369;
	V_ENAME VARCHAR2(30):='&员工姓名';
	V_JOB VARCHAR2(20):='&职位';
	V_MGR EMP.MGR%TYPE:=&上级编号;
	V_HIREDATE EMP.HIREDATE%TYPE :=TO_DATE('&入职日期','YYYY/MM/DD');
	V_SAL EMP.SAL%TYPE:=&工资;
	V_COMM EMP.SAL%TYPE:=&佣金;
	V_DEPTNO EMP.DEPTNO%TYPE:=&部门编号;
BEGIN
	UPDATE EMP SET 	ENAME=V_ENAME,
					JOB=V_JOB,
					MGR=V_MGR,
					HIREDATE=V_HIREDATE,
					SAL=V_SAL,
					COMM=V_COMM,
					DEPTNO=V_DEPTNO
					WHERE EMPNO=V_EMPNO ;
END;

占位符:N

有:n的占位符,则必有USING 子句

删除所有的触发器:

SELECT 'DROP TRIGGER'||OBJECT_NAME||';' FROM USER_OBJECTS WHERE OBJECT_TYPE='TRIGGER';


执行,再单击ALT选中多行, 再执行

举例:占位符的使用

DECLARE 
BEGIN
	EXECUTE IMMEDIATE 'DELETE FROM EMP WHERE EMPNO=:1' USING 7369;
END;

输出语句中单引号的转义

  • oracle字符串中包含字符串的情况
    1.使用两个单引号表示一个单引号
    2.使用chr()函数来获取一个单引号 chr(39)

举例:保存一个sql语句并执行

DECLARE 
	V_SQL VARCHAR2(200):='UPDATE EMP SET ENAME =''HELLO'',JOB :=''IT'',SAL=1234 WHERE EMPNO=7369;'
BEGIN 
	DBMS_OUTPUT.PUT_LINE(V_SQL);
END;


在这里插入图片描述

DECLARE 
	V_SQL VARCHAR2(200):='UPDATE EMP SET ENAME =''HELLO'',JOB :=''IT'',SAL=1234 WHERE EMPNO=7369;'
BEGIN 
	DBMS_OUTPUT.PUT_LINE(V_SQL);
	EXECUTE IMMEDIATE V_SQL;
END;

execute immediate语句和

直接执行的sql语句的区别

(1)ddl语句不能直接在plsql代码块中运行,但是可以放在 execute immediate中运行
(2)当sql语句操作的表,是使用 execute immediate动态创建的那么,只能在 execute immediate语句中执行
(3)当将表名放入变量中时,这时必须使用 execute immediate

举例:

DECLARE 
BEGIN 
	EXECUTE IMMEDIATE 'CREATE TABLE TTT3(ID NUMBER(11) ,NAME VARCHAR2(20))';
	EXECUTE IMMEDIATE 'INSERT INTO TTT3 VALUES (1,'PLSQL');';
END;
declare
   --声名一个变量变量,保存数据库中的表名
   v_tab varchar2(30):='EMP';
   
   --声名一个变量
   v_sal number(5):=500;
   --声名一个变量保存sql语句
   v_sql varchar2(200);
begin
   --update v_tab set sal=sal+v_sal; 不能运行
   v_sql:='update '||v_tab||' set sal=sal+'||v_sal;
   dbms_output.put_line(v_sql);
   execute immediate v_sql;
end;
update EMP set sal=sal+500;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值