【问题标题】:LISTAGG function in SQLPLUS on ORACLE 11g errorSQLPLUS 中的 LISTAGG 函数对 ORACLE 11g 错误
【发布时间】:2013-11-27 14:31:50
【问题描述】:

我目前有这些表,我的主要目的是通过连接 TABLE "ITEMS" 中的 category 和 item_number 来自动填充 event_item_exhibited 列。 经过大量研究后,我尝试使用 LISTAGG 函数,但在第 2 行出现错误: ORA-00909: 参数数量无效

CREATE TABLE ITEMOWNERS (itemOwner_number INT NOT NULL CHECK(itemOwner_number >= 1000 AND itemOwner_number <= 2999), 
          itemOwner_name VARCHAR(30) NOT NULL,                         
          itemOwner_address VARCHAR(100) NOT NULL,
          first_contact TIMESTAMP NOT NULL,                                                         
          PRIMARY KEY (itemOwner_number));



CREATE TABLE ITEMS (lent_by_itemOwner_number INT NOT NULL,
                    category CHAR (3) NOT NULL CONSTRAINT chk_category_input CHECK (category IN ('LDN','STH', 'MNC','SCT')),    
                    item_number NCHAR(3) NOT NULL UNIQUE,
                    item_name VARCHAR(30) NOT NULL UNIQUE,               
                    item_value NUMBER NOT NULL ,    
                    item_description VARCHAR(1000) NOT NULL,            
                    FOREIGN KEY (lent_by_itemOwner_number) REFERENCES ITEMOWNERS(itemOwner_number)); 

CREATE TABLE EVENTS (event_number INT NOT NULL CHECK(event_number >= 3000 AND event_number <= 3999),
                 event_item_exhibited VARCHAR(6) ,                                      
                 title  VARCHAR(100) NOT NULL UNIQUE,                            
                 event_description VARCHAR(1000) NOT NULL,                  
                 PRIMARY KEY (event_number));

我创建的函数如下;

SELECT event_number,
   LISTAGG(category, '/',item_number,',') WITHIN GROUP (ORDER BY category AND item_number) AS event_item_exhibited  
FROM (
   SELECT UNIQUE
          event_number,
     FROM EVENTS
   )
 GROUP BY event_number;

我附上了我的输出目标示例。 http://oi44.tinypic.com/2ur2dn4.jpg

这是我在你推荐后所做的;

CREATE TABLE ITEMOWNERS (itemOwner_number INT NOT NULL CHECK(itemOwner_number >= 1000 AND itemOwner_number <= 2999), 
          itemOwner_name VARCHAR(30) NOT NULL,                         
          itemOwner_address VARCHAR(100) NOT NULL,
          first_contact TIMESTAMP NOT NULL,                                                         
          PRIMARY KEY (itemOwner_number));



CREATE TABLE ITEMS (lent_by_itemOwner_number INT NOT NULL,
                    category CHAR (3) NOT NULL CONSTRAINT chk_category_input CHECK (category IN ('LDN','STH', 'MNC','SCT')),    
                    item_number NCHAR(3) NOT NULL UNIQUE,
                    item_name VARCHAR(30) NOT NULL UNIQUE,               
                    item_value NUMBER NOT NULL ,    
                    item_description VARCHAR(1000) NOT NULL,            
                    FOREIGN KEY (lent_by_itemOwner_number) REFERENCES ITEMOWNERS(itemOwner_number)); 

CREATE TABLE EVENTS (event_number INT NOT NULL CHECK(event_number >= 3000 AND event_number <= 3999),
                 event_item_exhibited VARCHAR(7) ,                                      
                 title  VARCHAR(100) NOT NULL UNIQUE,                            
                 event_description VARCHAR(1000) NOT NULL,                  
                 PRIMARY KEY (event_number));


INSERT INTO ITEMOWNERS VALUES ('1001','Edward','London',CURRENT_TIMESTAMP);
INSERT INTO ITEMOWNERS VALUES ('1002','Michael','Nottingham',CURRENT_TIMESTAMP);



INSERT into ITEMS VALUES ('1001','LDN','121','Penmate','500','Unique pen');
INSERT into ITEMS VALUES ('1002','MNC','131','Trampoline','1500','Professional equipment');


INSERT INTO EVENTS VALUES ('3001','LDN/121','PEN SHOW', 'Exclusive show of unique pens');
INSERT INTO EVENTS VALUES ('3002','MNC/131','Jump Club', 'Enjoy a session of tampolining');

最终需要的输出是这个。 http://oi39.tinypic.com/35a80on.jpg

ITEMOWNER_NUMBER  ITEMOWNER_NAME     ITEMOWNER_ADDRESS  FIRST_CONTACT                                            
        1001      Edward             London             27-NOV-13 15.14.43.899677                                                                          
        1002      Michael            Nottingham         27-NOV-13 15.14.43.930465                                                                           



LENT_BY_ITEMOWNER_NUMBER CATEGORY ITEM_NUMBER ITEM_NAME  ITEM_VALUE ITEM_DESCRIPTION

 1001                     LDN     121         Penmate    500        Unique pen
 1002                     MNC     131         Trampoline 1500       Professional equipment



   EVENT_NUMBER EVENT_ITEM  TITLE      EVENT_DESCRIPTION                                                                                               

           3001 LDN/121     PEN SHOW   Exclusive show of unique pens                                                                                           
           3002 MNC/131     Jump Club  Enjoy a session of tampolining                                                                                     

现在我的整个问题完全基于我如何通过将 CATEGORY 和 ITEM_NUMBER 从 TABLE ITEMS 合并到列 EVENT_ITEM 中来让数据库自己填充 EVENT_ITEM,如上所示。

【问题讨论】:

  • 对我原来的评论的跟进——我刚刚有机会回过头来讨论这个问题,发现你在这里遇到的问题比一些简单的语法错误要大得多。我认为您朝着正确方向迈出的第一步是通过以下方式更清楚地表达您的问题陈述:(1)编写实际工作的创建表脚本(在 Oracle,而不是 SQL Server 中),(2)编写加载有意义数据的插入语句,以及然后 (3) 提供与您的数据匹配的所需结果集,并清楚说明您是如何获得所需结果的。
  • 我已经更新了,手动输入完全没有问题,但是我想看看如何使它成为一个自动化的过程。
  • 对不起,我应该更清楚 - 我的意思是,除了让 INSERTS 加载有意义的数据样本之外,向我们展示您希望看到的数据的预期结果(以及清楚地解释如何获得这些结果)。这将确保响应者对您尝试自动化的内容有一个清晰的概念......
  • 我想我已经添加了所有内容来显示我被困在哪里。
  • 基本上只是将 CATEGORY 和 ITEM_NUMBER 合并到 EVENTS 表中。

标签: oracle oracle11g sqlplus


【解决方案1】:
LISTAGG(category, '/',item_number,',') 
    WITHIN GROUP (ORDER BY category AND item_number) AS event_item_exhibited

那里有几个语法错误,应该是

LISTAGG(category || '/' || item_number,',') 
    WITHIN GROUP (ORDER BY category , item_number) AS event_item_exhibited

【讨论】:

  • 谢谢,似乎有助于克服当前的错误,但是我现在遇到了另一个问题。 “第 2 行错误:ORA-00904:“ITEM_NUMBER”:无效标识符”是因为它在另一个表中吗?那么类别肯定应该给出相同的错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 2016-07-25
  • 1970-01-01
  • 2016-09-02
  • 2011-03-01
相关资源
最近更新 更多