暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 无法通过函数从VARRAY检索超过2个值

askTom 2017-05-25
147

问题描述

大家好。
我要尝试大约两天。

我试图通过函数检索记录内的VARRAY的值。这是我的代码,所以我可以更好地解释

我已经创建了这个数组
--Creazione del VARRAY DI GENERE
CREATE OR REPLACE TYPE GENERI_G AS VARRAY(5) OF VARCHAR(30);
/
复制


在这个表上有列 “GENERI”,类型是我之前声明的VARRAY类型。
CREATE TABLE VIDEOGIOCO(
NOME_G   VARCHAR(40) NOT NULL,
PAR_IVA_A  CHAR(11) NOT NULL,
DESCRIZIONE_G VARCHAR(150) NOT NULL,
PREZZO_L  PREZZO NOT NULL,
PREZZO_V  PREZZO NOT NULL,
GENERI  GENERI_G, -- THIS IS THE COLUMN WHERE I WANT TO FIND THE VALUES BY FUNCTION.
MODALITA_DI_GIOCO MOD_DI_GIOCO,
CODICE_BARRE VARCHAR(20) NOT NULL,
SPAZIO_MEMORIA VARCHAR(8) NOT NULL,
IMMAGINE   BLOB,
MANUALE   CLOB,
CONSTRAINT  PK_VIDEOGIOCO_NOME_G PRIMARY KEY(NOME_G),
CONSTRAINT FK_VIDEOGIOCO_P_IVA_A FOREIGN KEY (PAR_IVA_A) REFERENCES AZIENDA(P_IVA_A),
CONSTRAINT CH_PREZL_PREZA CHECK (PREZZO_V.VALORE_MONETA < PREZZO_L.VALORE_MONETA),
CONSTRAINT  CH_PREZZO_L_M0 CHECK (PREZZO_L.VALORE_MONETA > 0.0),
CONSTRAINT  CH_PREZZO_V_M0 CHECK (PREZZO_V.VALORE_MONETA > 0.0)
) LOB (IMMAGINE) STORE AS IMMAGINE_VIDEOGIOCO (TABLESPACE TS_CATENA_V_LOB DISABLE STORAGE IN ROW PCTVERSION 10 CACHE),
LOB (MANUALE) STORE AS MANUALE_VIDEOGIOCO (TABLESPACE TS_CATENA_V_LOB DISABLE STORAGE IN ROW PCTVERSION 10 CACHE),
TABLESPACE TS_CATENA_VIDEOGIOCHI;
复制


-当记录的VARRAY值超过1时,此函数会给我一个错误

现在我创建了这个函数来查找VARRAY内部的值。

CREATE OR REPLACE FUNCTION GENERE_V(NOME_GIOCO IN VARCHAR)
RETURN VARCHAR
IS DATI_GENERE VARCHAR(150);
BEGIN
 SELECT TV.* INTO DATI_GENERE FROM CATENA_DI_NEGOZI.VIDEOGIOCO V, TABLE(V.GENERI) TV WHERE V.NOME_G=NOME_GIOCO;
 RETURN DATI_GENERE;
END;
/
复制


这是我将执行的查询
SELECT NOME_G,GENERE_V(NOME_G) FROM VIDEOGIOCO;
复制


当该行在Varray中只有一个值时,没有问题,但是当有2个值时,我得到以下错误:
精确获取返回的行数多于请求的行数。

我如何解决这个问题?

专家解答

当您在这里使用select-进入时:

SELECT TV.* INTO DATI_GENERE FROM CATENA_DI_NEGOZI.VIDEOGIOCO V, TABLE(V.GENERI) TV WHERE V.NOME_G=NOME_GIOCO;
复制


您正在将值提取到一个变量中。但是当你的varray有两个元素时,查询返回两行。

2进1不走!

CREATE OR REPLACE TYPE GENERI_G AS VARRAY(5) OF VARCHAR(30);
/
declare
  arr generi_g := generi_g();
  val varchar2(1);
begin
  arr.extend;
  arr(1) := '1';
  
  select * into val from table(arr);
  dbms_output.put_line( 'Fetched ' || val );
  arr.extend;
  arr(2) := '2';
  
  select * into val from table(arr);
    
end;
/
Fetched 1

ORA-01422: exact fetch returns more than requested number of rows
复制


如果要同时选择多个行,可以使用批量收集。这将你的结果放入一个数组:

declare
  arr generi_g := generi_g();
  vals dbms_sql.varchar2_table;
begin
  arr.extend(2);
  arr(1) := '1';
  arr(2) := '2';
  
  select * bulk collect into vals from table(arr);

  for i in 1 .. vals.count loop
    dbms_output.put_line( 'Fetched ' || vals(i) );
  end loop;
end;
/

Fetched 1
Fetched 2
复制

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论