我有以下声明在我的包中编译好:
包头:
TYPE role_user_type IS RECORD (
ROLE_ID some_table.ROLE_ID%TYPE,
SUBGROUP some_table.USER_ID%TYPE
);
Run Code Online (Sandbox Code Playgroud)
身体:
ROLE_USER_REC MY_PACKAGE.ROLE_USER_TYPE;
SELECT B.USER_ID, B.ROLE INTO ROLE_USER_REC
FROM some_table where user_id like 'M%'
Run Code Online (Sandbox Code Playgroud)
循环的骨架是什么ROLE_USER_REC?我们甚至可以通过它吗?
Pet*_*ang 17
没有什么可循环的.
role_user_type 定义单个记录,您可以通过以下方式访问:
dbms_output.put_line( role_user_rec.role_id || ', ' || role_user_rec.subgroup );
Run Code Online (Sandbox Code Playgroud)
SELECT ... INTO只要返回多行,您的操作就会失败.
如果需要存储其中几条记录,可以使用嵌套表,如
TYPE role_user_tab IS TABLE OF role_user_type:
示例:
DECLARE
TYPE role_user_type IS RECORD (
ROLE_ID VARCHAR2(10),
SUBGROUP VARCHAR2(10)
);
TYPE role_user_tab IS TABLE OF role_user_type;
role_user_rec role_user_tab;
BEGIN
SELECT 'A', 'B'
BULK COLLECT INTO role_user_rec
FROM dual;
FOR i IN role_user_rec.FIRST .. role_user_rec.LAST LOOP
dbms_output.put_line( role_user_rec(i).role_id || ', ' || role_user_rec(i).subgroup );
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
您可以使用游标FOR循环:
BEGIN
FOR role_user_type IN ('SELECT B.USER_ID, B.ROLE FROM some_table where user_id like ''M%'')
LOOP
dbms_output.put_line('User ID: '||role_user_type.user_id);
etc...
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
另一种选择:
DECLARE
CURSOR C IS
SELECT B.USER_ID, B.ROLE
FROM some_table
where user_id like 'M%';
BEGIN
FOR role_user_type IN C LOOP
dbms_output.put_line('User ID: '||role_user_type.user_id);
etc...
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
65617 次 |
| 最近记录: |