Oracle 从主键列中选择返回空值?

Posted

技术标签:

【中文标题】Oracle 从主键列中选择返回空值?【英文标题】:Oracle Select From primary key column return null value? 【发布时间】:2014-08-28 02:39:37 【问题描述】:

我从查询中创建了一个视图。此查询从连接在一起的 2 个表中检索数据。其中之一使用主键进行内部连接。但是数据在主键上返回空结果。这里有什么问题?

CREATE TABLE orderinfo
(
    orderid   VARCHAR2 (20),
    qtty      NUMBER (20, 0),
    price     NUMBER (20, 0)
)
/

ALTER TABLE orderinfo ADD CONSTRAINT orderinfo_pk PRIMARY KEY (orderid)
/
INSERT INTO orderinfo (orderid, qtty, price)
  VALUES   ('OD00001', 1000, 15000);

INSERT INTO orderinfo (orderid, qtty, price)
  VALUES   ('OD00002', 2000, 15000);

INSERT INTO orderinfo (orderid, qtty, price)
  VALUES   ('OD00003', 3000, 15000);

INSERT INTO orderinfo (orderid, qtty, price)
  VALUES   ('OD00004', 4000, 15000);

COMMIT
/

create table ordersend
(
    orderid varchar2(20),
    orderstatus varchar2(3)
)
ALTER TABLE ordersend ADD CONSTRAINT ordersend_pk PRIMARY KEY (orderid)
/

INSERT INTO ordersend (orderid, status)
  VALUES   ('OD00001', 'N');

INSERT INTO ordersend (orderid, status)
  VALUES   ('OD00002', 'N');

INSERT INTO ordersend (orderid, status)
  VALUES   ('OD00003', 'N');

INSERT INTO ordersend (orderid, status)
  VALUES   ('OD00004', 'N');

COMMIT
/

CREATE VIEW vw_ordersendstatus
AS
    SELECT   "orderid",
             "qtty",
             "price",
             "status"
      FROM   (SELECT   inf.orderid,
                       inf.qtty,
                       inf.price,
                       send.status
                FROM   orderinfo inf, ordersend send
               WHERE   inf.orderid = send.orderid AND status = 'N')
/
CREATE TABLE orderblock
(
    orderid   VARCHAR2 (20),
    qtty      NUMBER (20, 0),
    price     NUMBER (20, 0)
)
/
CREATE PROCEDURE pr_sendorder
IS
    CURSOR c_send
    IS
        SELECT   orderid orderid,
                 qtty,
                 price,
                 status
          FROM   vw_ordersendstatus;
BEGIN
    FOR i IN c_send
    LOOP
        INSERT INTO orderblock (orderid, qtty, price)
          VALUES   (i.orderid, i.qtty, i.price);

        UPDATE   ordersend
           SET   status = 'B'
         WHERE   orderid = i.orderid;
    END LOOP;
EXCEPTION
    WHEN OTHERS
    THEN
        RAISE '-1';
END;

然后 SELECT * FROM 订单块

在 orderid 字段上返回 null 值

为什么??? 请帮忙

【问题讨论】:

当子查询不使用这些标识符时,由于您在select 中使用了区分大小写的标识符,您的视图无法成功编译。您在ordersend 中的insert 语句失败,因为没有status 列。 【参考方案1】:

ordersend 的创建表不包含视图中提到的 STATUS 列。

在视图中,您使用了带引号的小写列名。引号强制 Oracle 将它们视为区分大小写。

如果您混淆了带引号和不带引号的列/变量名称,您可能会遇到这样的情况:不带引号的 orderid 的值来自大写的 ORDERID 或不带引号的 orderid,而不是您期望的带引号的小写“orderid”。最好避免为列、变量和表使用带引号的标识符。

没有完整的脚本,很难确定

【讨论】:

【参考方案2】:

谢谢加里, 在我的问题中,我有一个错误的观点。 正确的是:

INSERT INTO ordersend (orderid, orderstatus)
  VALUES   ('OD00001', 'N');

INSERT INTO ordersend (orderid, orderstatus)
  VALUES   ('OD00002', 'N');

INSERT INTO ordersend (orderid, orderstatus)
  VALUES   ('OD00003', 'N');

INSERT INTO ordersend (orderid, orderstatus)
  VALUES   ('OD00004', 'N');

CREATE VIEW vw_ordersendstatus
AS
    SELECT   "ORDERID",
             "QTTY",
             "PRICE",
             "STATUS"
      FROM   (SELECT   inf.orderid,
                       inf.qtty,
                       inf.price,
                       send.orderstatus status
                FROM   orderinfo inf, ordersend send
               WHERE   inf.orderid = send.orderid AND orderstatus = 'N')

【讨论】:

以上是关于Oracle 从主键列中选择返回空值?的主要内容,如果未能解决你的问题,请参考以下文章

如果我们使用自动递增的标识列和PK,则违反3NF

C# WinForms - DataGridView/SQL Compact - 主键列中的负整数

oracle:物化视图中的主键列

我应该在 Oracle 中索引主键列吗

如何连接 Oracle 中的三个表,其中一个表在外键列中有空值?

如何从表中选择主键列?