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 从主键列中选择返回空值?的主要内容,如果未能解决你的问题,请参考以下文章
C# WinForms - DataGridView/SQL Compact - 主键列中的负整数