我有以下示例代码
DECLARE
myRow table%rowtype
myVar table2.column%type
BEGIN
SELECT table.col1, table.col3, table.col4, table2.column
INTO myRow
FROM table
JOIN table2
On table.col6 = table2.col1;
END;
我如何重构以使其成为有效的陈述?我可以以某种方式将加入的列存储到myRow或myVar上吗?
答案 0 :(得分:6)
您的PL / SQL有效并且可以接受:
如果table TABLE不包含正好4列,那么你需要选择其他东西,可能只有4个变量:
DECLARE
v_col1 table.col1%type;
v_col3 table.col3%type;
v_col4 table.col4%type;
v_column table2.column%type;
BEGIN
SELECT table.col1, table.col3, table.col4, table2.column
INTO v_col1, v_col3, v_col4, v_column
FROM table
JOIN table2
On table.col6 = table2.col1;
END;
如果您的查询返回超过1行,您将获得TOO_MANY_ROWS异常;如果它没有返回任何行,你将得到NO_DATA_FOUND异常。
答案 1 :(得分:1)
您可以使用光标执行此操作。这样你就不必担心TOO_MANY_ROWS或NO_DATA_FOUND异常。
此外,您还可以灵活地在每次向查询添加列时自动将其添加到相同类型的变量中
光标有两个选项:只使用返回的第一行或使用所有行。
选项#1
DECLARE
CURSOR C_DATA IS
SELECT
table.col1, -- Column 2 intentionally left out
table.col3,
table.col4,
table2.column --Column from joined table
FROM table
JOIN table2
On table.col6 = table2.col1;
myRow C_DATA%rowtype
BEGIN
OPEN C_DATA;
FETCH c_data INTO myRow;
CLOSE C_DATA;
-- USE ANYWHERE INSIDE THIS ESCOPE YOUR COLUMNS as myRow.col4.
END;
选项#2
DECLARE
CURSOR C_DATA IS
SELECT
table.col1, -- Column 2 intentionally left out
table.col3,
table.col4,
table2.column --Column from joined table
FROM table
JOIN table2
On table.col6 = table2.col1;
BEGIN
FOR myRow IN C_DATA LOOP
-- USE INSIDE HERE YOUR COLUMNS as myRow.col4.
END LOOP;
END;
答案 2 :(得分:0)
这是我目前所拥有的,基于Tony Andrews。
DECLARE
myRow table%rowtype
myVar table2.column%type
BEGIN
SELECT
table.col1, -- Column 2 intentionally left out
table.col3,
table.col4,
table2.column --Column from joined table
INTO
myRow.col1,
myRow.col3,
myRow.col4,
myVar -- Won't store into myRow, so made a separate variable
FROM table
JOIN table2
On table.col6 = table2.col1;
END;
这是我提出的最好的。它允许我在进行连接时选择某些列并将所有值存储到变量中。不优雅,但似乎满足了这个问题。其他答案仍然受到欢迎。