PLSQL数据类型
%TYPE
说明
%TYPE支持以下两种定义形式,scalar_variable_name和db_table_or_view_name. column_name,表示常规变量名和表/视图名.列名:
1、常规变量名:scalar_variable_name%TYPE
2、表或视图的列:db_table_or_view_name. column_name %TYPE
示例
highgo=# create table t1(unique1 int);
CREATE TABLE
highgo=# insert into t1 select generate_series(1,100);
INSERT 0 100
highgo=# create or replace procedure p1(id int)
highgo-# as
highgo-# curs1 CURSOR FOR SELECT * FROM t1;
highgo-# curs2 refcursor;
highgo-# curs3 CURSOR (key integer) FOR SELECT * FROM t1 WHERE unique1 = key;
highgo-# curs4 curs1%TYPE;
highgo-# curs5 curs2%TYPE;
highgo-# curs6 curs3%TYPE;
highgo-# BEGIN
highgo-# OPEN curs1;
highgo-# CLOSE curs1;
highgo-# END;
highgo-# /
CREATE PROCEDURE
highgo=# call p1(1);
Call completed.
highgo=# \df+ p1
List of functions
Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Source code
| Description
-——-+——+——————+———————+——+————+———-+————+———-+——————-+———-+————————————————————–
-———+————-
public | p1 | | IN id integer | proc | volatile | unsafe | highgo| definer | | plisql | curs1 CURSOR FOR SELECT * FROM t1;
+|
| | | | | | | | | | | curs2 refcursor;
+|
| | | | | | | | | | | curs3 CURSOR (key integer) FOR SELECT * FROM t1 WHERE uniqu
e1 = key;+|
| | | | | | | | | | | curs4 curs1%TYPE;
+|
| | | | | | | | | | | curs5 curs2%TYPE;
+|
| | | | | | | | | | | curs6 curs3%TYPE;
+|
| | | | | | | | | | | BEGIN
+|
| | | | | | | | | | | OPEN curs1;
+|
| | | | | | | | | | | CLOSE curs1;
+|
| | | | | | | | | | | END
|
(1 row)
%ROWTYPE
说明
支持表名%ROWTYPE或视图名%ROWTYPE作为函数或存储过程参数类型和函数返回值类型。
%ROWTYPE声明的变量不会继承引用表的初始值或约束。
注意事项:
支持查询列赋值给一个%ROWTYPE变量,例如:SELECT * INTO %rowtype声明的变量 FROM table; 需要注意的是:如果查询的列数少于或多于%rowtype声明的变量成员个数,默认情况下不报错。只有set plisql.extra_errors = ‘all’; 才会报错。
示例
highgo=# create table tb1(id int,name varchar(5));
CREATE TABLE
highgo=# insert into tb1 values(1,’sam’);
INSERT 0 1
highgo=# insert into tb1 values(2,’amy’);
INSERT 0 1
highgo=# declare
highgo-# var1 tb1%rowtype;
highgo-# begin
highgo-# select id,name into var1 from tb1 where id=2;
highgo-# raise notice ‘id:%,name:%’,var1.id,var1.name;
highgo-# end;
highgo-# /
NOTICE: id:2,name:amy
PL/iSQL procedure successfully completed.
#当源和目标的字段不匹配,则提示错误信息
highgo=# set plisql.extra_errors = ‘all’; –设置参数
SET
highgo=# declare
highgo-# var1 tb1%rowtype;
highgo-# begin
highgo-# select id into var1 from tb1 where id=2;
highgo-# end;
highgo-# /
ERROR: Return rowtype or query do not match
背景: PL/iSQL function inline_code_block line 4 at SQL statement
RECORD
说明
RECORD类型是一个局部类型,只在声明它的块中使用。如果定义在独立的或包子程序中,RECORD类型存储在数据库中。
定义在包规范中的RECORD类型是公共的,可以在包外通过package_name.type_name引用RECORD类型。因为它存储在数据库中直到通过DROP PACKAGE语句删除包。
示例
CREATE TABLE employees ( employee_id NUMBER, first_name VARCHAR2(50), last_name VARCHAR2(50), salary NUMBER );
INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES (1, ‘John’, ‘Doe’, 50000);
INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES (2, ‘Jane’, ‘Smith’, 55000);
INSERT INTO employees (employee_id, first_name, last_name, salary) VALUES (3, ‘Alice’, ‘Johnson’, 60000);
DECLARE
-- 定义一个 RECORD 类型
TYPE employee_record IS RECORD (
employee_id NUMBER,
first_name VARCHAR2(50),
last_name VARCHAR2(50),
salary NUMBER
);
-- 声明一个该类型的变量
emp employee_record;
BEGIN
-- 从 employees 表中选择一行
SELECT employee_id, first_name, last_name, salary
INTO emp
FROM employees
WHERE employee_id = 1;
-- 打印结果
raise notice ‘Employee ID:% ‘ , emp.employee_id;
raise notice ‘First Name: %’, emp.first_name;
raise notice ‘Last Name: %’, emp.last_name;
raise notice ‘Salary: %’, emp.salary;
END;
/
--输出结果
NOTICE: Employee ID:1
NOTICE: First Name: John
NOTICE: Last Name: Doe
NOTICE: Salary: 50000
PL/iSQL procedure successfully completed.