0

我正在尝试在两个表的完全连接上运行游标,但在访问游标中的列时遇到问题。

CREATE  TABLE APPLE(
    MY_ID           VARCHAR(2) NOT NULL,
    A_TIMESTAMP     TIMESTAMP,
    A_NAME          VARCHAR(10)
);

CREATE  TABLE BANANA(
    MY_ID           VARCHAR(2) NOT NULL,
    B_TIMESTAMP     TIMESTAMP,
    B_NAME          VARCHAR(10)
);

我已经编写了一个完全连接来返回表 A 和 B 中的所有相关行,其中两个时间戳中的任何一个都在未来。即,如果表 APPLE 中的一行将来有时间戳,则从 APPLE 中获取行,并与 MY_ID 上的 BANANA 中的行连接。类似地,如果表 BANANA 中的行将来有时间戳,则从 BANANA 中获取行,并与 MY_ID 上的 APPLE 中的行连接 此完全连接为我工作。

select * from APPLE a full join BANANA b on  a.MY_ID = b.MY_ID where 
    (
      a.A_TIMESTAMP > current_timestamp
      or b.B_TIMESTAMP > current_timestamp 
    );

现在我想遍历每个加入的记录并进行一些处理。我能够访问仅存在于一个表中的列,但在尝试访问两个表中相同的列名时出现错误。例如。在这种情况下是身份证。

create or replace 
PROCEDURE testProc(someDate IN DATE)
AS
CURSOR c1 IS
    select * from APPLE a full join BANANA b on  a.MY_ID = b.MY_ID where 
    (
      a.A_TIMESTAMP > current_timestamp
      or b.B_TIMESTAMP > current_timestamp 
    );

BEGIN
    FOR rec IN c1
    LOOP    
        DBMS_OUTPUT.PUT_LINE(rec.A_NAME);
        DBMS_OUTPUT.PUT_LINE(rec.A_TIMESTAMP);
        DBMS_OUTPUT.PUT_LINE(rec.MY_ID);
    END LOOP;
END testProc;

编译上述过程时出现此错误:

错误(16,28):PLS-00302:必须声明组件“MY_ID”

而且我不确定如何访问 MY_ID 元素。我相信这会很简单,但我是数据库编程的新手,一直在尝试但找不到正确的方法。任何帮助表示赞赏。谢谢

4

2 回答 2

2

在这种情况下,您可以做的另一件事是USING使用子句而不是 using连接表ON,如下所示:

select *
  from APPLE a
  full join BANANA b
    USING (MY_ID)
where a.A_TIMESTAMP > current_timestamp or
      b.B_TIMESTAMP > current_timestamp

USING如果两个表上的列具有相同的名称,并且键值的比较是使用相等 ('=') 运算符进行的,则可以使用。在结果集中,将有一个名为 MY_ID 的列以及两个表中的其他列(A_TIMESTAMP、B_TIMESTAMP 等)。

分享和享受。

于 2013-07-22T11:02:13.440 回答
1

我认为问题是MY_ID在两个表中都定义了,所以*得到它们。尝试使用此查询定义游标:

select coalesce(A.MY_ID, B.MY_ID) as MY_ID,
       A_TIMESTAMP, A_NAME, B_TIMESTAMP, B_NAME
from APPLE a full join
     BANANA b
     on a.MY_ID = b.MY_ID
where a.A_TIMESTAMP > current_timestamp or b.B_TIMESTAMP > current_timestamp;

编辑:

您有两个冲突列的问题。如果这只是一个内部连接,你可以这样做:

select A.*, B_TIMESTAMP, B_NAME

也就是说,您可以使用从一个表中选择列,*然后单独选择其余列。但是,这是一个full outer join,因此有一组您要使用的列coalesce()

所以,最好的答案是你应该列出所有的列。无论如何,这都是一种很好的编码实践,并且有助于在从表中添加或删除列时防止代码出现意外错误。

于 2013-07-21T19:14:33.250 回答