【问题标题】:Oracle SQL - Selecting a value from select and using it as part of the insertOracle SQL - 从选择中选择一个值并将其用作插入的一部分
【发布时间】:2017-12-10 20:46:01
【问题描述】:

我正在选择一个数值并将其存储到一个变量中,但是当我在插入语句中使用它时,我收到了这个错误:

ORA-00984:此处不允许列。

这是我的 SQL:

DECLARE
   RyanuserID NUMBER(10);
BEGIN
   SELECT Publisher_ID
   INTO RyanuserID
   FROM tblPublishers
   WHERE Publisher_Name ='Ryan'
   AND ROWNUM = 1;
END;
/

INSERT INTO tblBooks (Barcode, Book_Title, Publisher_ID, Year_Published, Stock) 
VALUES ('45879654236547', 'Lean HTML and CSS', RyanuserID, '2010', 4);

有什么建议吗?非常感谢

【问题讨论】:

  • 您应该担心rownum = 1。如果这是必要的,因为publisher_name 不是唯一的,那么publisher_id 本质上是随机的,这对于看起来应该是外键的东西来说很奇怪。
  • 发布者名称是唯一的,我只是将其放入以防万一,但如果不需要,我想我应该将其删除。谢谢你的指点

标签: sql oracle plsql insert


【解决方案1】:

您可以使用INSERT INTO ... SELECT 将其表述为单个插入语句:

INSERT INTO tblBooks (Barcode, Book_Title, Publisher_ID, Year_Published, Stock)
SELECT '45879654236547', 'Lean HTML and CSS', Publisher_ID, '2010', 4
FROM tblPublishers
WHERE Publisher_Name = 'Ryan' AND ROWNUM = 1;

【讨论】:

    【解决方案2】:

    您应该在 begin .. end 语句之间使用它。因为RyanuserID这种方式是无法识别的,而且从表的列类型和变量的类型兼容的角度来看,最好定义为返回列的类型(tblPublishers.Publisher_ID%type)。

    DECLARE 
       RyanuserID tblPublishers.Publisher_ID%type := &i_pbl_id; -- as an initialization value you may call in such a way.
       v_publisher_name tblPublishers.Publisher_Name%type := '&i_pbl_name' -- Ryan (as one of values);
    BEGIN
       SELECT Publisher_ID  INTO RyanuserID FROM tblPublishers WHERE Publisher_Name = v_publisher_name AND ROWNUM = 1;
       INSERT INTO tblBooks (Barcode, Book_Title, Publisher_ID, Year_Published, Stock) VALUES ('45879654236547', 'Lean HTML and CSS', RyanuserID, '2010', 4);
    END;
    /
    

    此外,最好使用bind variables 而不是 literals 如上示例。因为,literals 表示解析 SQL 永远。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-27
      • 2021-07-03
      相关资源
      最近更新 更多