--oracle复合标量
/*****************************pl/sql记录 (类似于结构体) *********************/
--只能接受一条记录
DECLARE
TYPE EMP_RECORD IS RECORD(
EMPNO EMP.EMPNO%TYPE,
ENAME EMP.ENAME%TYPE,
DNAME DEPT.DNAME%TYPE);
V_EMP EMP_RECORD;
BEGIN
SELECT E.EMPNO, E.ENAME, D.DNAME INTO V_EMP
FROM DEPT D
LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO
WHERE E.EMPNO = 7369;
DBMS_OUTPUT.put_line(V_EMP.EMPNO || '-' || V_EMP.ENAME || '-' || V_EMP.DNAME);
END;
/************************* pl/sql表 **************************/
--第一种用法
DECLARE
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE;
ET EMP_TABLE;
BEGIN
--使用如下的语句将查询得到的结果集批量的保存在变量里
SELECT E.* BULK COLLECT INTO ET FROM EMP E;
FOR I IN ET.FIRST() .. ET.LAST() LOOP
DBMS_OUTPUT.put_line(I||'-姓名:' || ET(I).ENAME || '- 工作:' || ET(I).JOB);
END LOOP;
END;
--第二种用法
DECLARE
TYPE EMP_TABLE IS TABLE OF EMP.ENAME%TYPE INDEX BY BINARY_INTEGER;
ET EMP_TABLE;
BEGIN
--赋值
FOR I IN (SELECT ROWNUM, ENAME FROM EMP) LOOP
ET(I.ROWNUM) := I.ENAME;
END LOOP;
--取值
FOR J IN ET.FIRST() .. ET.LAST() LOOP
DBMS_OUTPUT.put_line(J || '-' || ET(J));
END LOOP;
END;
/**************************参照变量(游标)*******************************/
DECLARE
TYPE EMP_CURSOR IS REF CURSOR;
V_EMP_CURSOR EMP_CURSOR;
V_EMP_RECORD EMP%ROWTYPE;
BEGIN
OPEN V_EMP_CURSOR FOR SELECT * FROM EMP;
LOOP
FETCH V_EMP_CURSOR INTO V_EMP_RECORD;
EXIT WHEN V_EMP_CURSOR%NOTFOUND;
DBMS_OUTPUT.put_line(V_EMP_RECORD.EMPNO || '-' || V_EMP_RECORD.ENAME);
END LOOP;
END;
-- 嵌套表
-- varry 动态数组
/*****************************pl/sql记录 (类似于结构体) *********************/
--只能接受一条记录
DECLARE
TYPE EMP_RECORD IS RECORD(
EMPNO EMP.EMPNO%TYPE,
ENAME EMP.ENAME%TYPE,
DNAME DEPT.DNAME%TYPE);
V_EMP EMP_RECORD;
BEGIN
SELECT E.EMPNO, E.ENAME, D.DNAME INTO V_EMP
FROM DEPT D
LEFT JOIN EMP E ON D.DEPTNO = E.DEPTNO
WHERE E.EMPNO = 7369;
DBMS_OUTPUT.put_line(V_EMP.EMPNO || '-' || V_EMP.ENAME || '-' || V_EMP.DNAME);
END;
/************************* pl/sql表 **************************/
--第一种用法
DECLARE
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE;
ET EMP_TABLE;
BEGIN
--使用如下的语句将查询得到的结果集批量的保存在变量里
SELECT E.* BULK COLLECT INTO ET FROM EMP E;
FOR I IN ET.FIRST() .. ET.LAST() LOOP
DBMS_OUTPUT.put_line(I||'-姓名:' || ET(I).ENAME || '- 工作:' || ET(I).JOB);
END LOOP;
END;
--第二种用法
DECLARE
TYPE EMP_TABLE IS TABLE OF EMP.ENAME%TYPE INDEX BY BINARY_INTEGER;
ET EMP_TABLE;
BEGIN
--赋值
FOR I IN (SELECT ROWNUM, ENAME FROM EMP) LOOP
ET(I.ROWNUM) := I.ENAME;
END LOOP;
--取值
FOR J IN ET.FIRST() .. ET.LAST() LOOP
DBMS_OUTPUT.put_line(J || '-' || ET(J));
END LOOP;
END;
/**************************参照变量(游标)*******************************/
DECLARE
TYPE EMP_CURSOR IS REF CURSOR;
V_EMP_CURSOR EMP_CURSOR;
V_EMP_RECORD EMP%ROWTYPE;
BEGIN
OPEN V_EMP_CURSOR FOR SELECT * FROM EMP;
LOOP
FETCH V_EMP_CURSOR INTO V_EMP_RECORD;
EXIT WHEN V_EMP_CURSOR%NOTFOUND;
DBMS_OUTPUT.put_line(V_EMP_RECORD.EMPNO || '-' || V_EMP_RECORD.ENAME);
END LOOP;
END;
-- 嵌套表
-- varry 动态数组