2016-03-23 8 views
0

名前と姓を格納するネストした表を作成しました。 1つの名前には2つの姓があります。ネストした表の操作

CREATE OR REPLACE TYPE list_surname AS TABLE OF VARCHAR2(10); 
/
CREATE TABLE person (name varchar2(10), 
surname list_surname) 
NESTED TABLE surname STORE AS list; 
/

INSERT INTO person VALUES('Olsen', list_surname('Arthur', 'Baxter')); 
INSERT INTO person VALUES('Jensen', list_surname('Barney', 'Louis')); 
INSERT INTO person VALUES('Andersen', list_surname('Chase', 'Mason')); 
/

今、私は数えると、人々は文字が含まれていても1人の姓を持っているどのように多く表示するには、無名ブロックを作りたい「U」を、その人は彼の姓に文字「U」を持っているならば、私がしたいですその人(名前+姓)を印刷します。

set serveroutput on 
DECLARE 
v_var VARCHAR2(32); 
v_nr NUMBER(30); 
cursor c1 (var VARCHAR2) is 
    select regexp_count(var,'[u]',1,'i') from dual; 
BEGIN 
    FOR i IN person.FIRST .. person.LAST LOOP 
     v_nr := 0; 
     open c1(person.list_surname); 
     loop 
     fetch c1 into v_nr; 
     exit when c1%notfound; 
     IF v_nr > 0 THEN 
      DBMS_OUTPUT.put_line(person); 
     end if; 
     end loop; 
     close c1; 
    end loop; 
END; 
/

私はこれが初めてですので、ネストした表での作業では本当によくないよ:これは私がこれまでに作ったものです。どんな提案も大歓迎です。ありがとう!

答えて

0

は1未満に試してみてください。

set serveroutput on 

DECLARE 
    v_var VARCHAR2 (32); 
    v_nr NUMBER (30) := 0; 

    CURSOR c_name 
    IS 
     SELECT name FROM person; 

    CURSOR c_surname (p_name person.name%TYPE) 
    IS 
     SELECT VALUE (c) sn 
     FROM THE (SELECT surname 
        FROM person 
        WHERE name = p_name) c; 
BEGIN 
    FOR cur IN c_name 
    LOOP 
     FOR cs IN c_surname (cur.name) 
     LOOP 
     IF INSTR (cs.sn, 'u') > 0 
     THEN 
     v_nr := v_nr + 1; 
      DBMS_OUTPUT.put_line (
       cur.name || ' ' || cs.sn); 
     END IF; 
     END LOOP; 
    END LOOP; 
    dbms_output.put_line('Total Count: '||v_nr); 
END; 
/
関連する問題