Tabela 1

ID
----------
1
2
3
4
5

Tabela 2

ID                    Desc
------------------------------
A1                    Apple
A2                    Pear
A3                    Orange

Próbuję stworzyć funkcję w Oracle, aby dodać prefiks "A" w tabeli 1, a po tym chcę spojrzeć w górę w tabeli 2, aby wrócić DESC. Musi być funkcją.

Dziękuję Ci!!!

0
Jessie Wang 5 czerwiec 2018, 04:34

3 odpowiedzi

Najlepsza odpowiedź

Możesz użyć następujących dotyczących utworzenia takiej funkcji:

Create or Replace Function Get_Fruit( i_id table2.description%type ) 
  Return table2.description%type Is
  o_desc table2.description%type;
Begin
  for c in ( select description from table2 where id = 'A'||to_char(i_id) )
  loop
    o_desc := c.description; 
  end loop;
  return o_desc;
End; 

Gdzie

  • Nie ma potrzeby dołączenia do obsługi wyjątku, z powodu używania cursor zamiast select into klauzula.
  • przy użyciu table_name.col_name%type do deklaracji typów danych dla Argumenty lub zmienne powodują powiązany typ danych kolumn dynamiczny. To byliby mogli polegać na rodzaju danych Powiązane kolumny.

  • Zarezerwowane słowa kluczowe, takie jak desc, nie mogą być używane jako nazwy kolumn tabel, chyba że są wyrażone w podwójnych cytatach ({x1}})

Aby zadzwonić do tej funkcji, preferowane są następujące:

SQL> set serveroutput on
SQL> declare
  2     i_id    pls_integer := 1;
  3     o_fruit varchar2(55);
  4  begin
  5     o_fruit := get_fruit(  i_id  );
  6     dbms_output.put_line( o_fruit );
  7  end;
  8  /

Apple

PL/SQL procedure successfully completed
0
Barbaros Özhan 5 czerwiec 2018, 05:32

Nie jestem pewien ze swoim pytaniem - próbujesz osiągnąć coś takiego: -

CREATE OR REPLACE FUNCTION Replace_Value 
(
input_ID IN VARCHAR2
) RETURN VARCHAR2 
AS 
    v_ID varchar(2); 
BEGIN 
    begin
    SELECT distinct a.ID into v_id from Table 2 a where a.ID in (select 'A'||b.id from table1 b where b.id=input_ID); 
    exception
        when others then
            dbms_output.put_line(sqlcode);
    end;
    RETURN v_id; 
END Replace_Value;
0
Atul Kr Dey 5 czerwiec 2018, 03:17

Próbujesz czegoś takiego?

CREATE OR replace FUNCTION replace_value (table_name IN VARCHAR2, 
                                          input_id   IN INTEGER) 
RETURN VARCHAR2 
AS 
  v_desc VARCHAR(20); 
BEGIN 
    SELECT descr 
    INTO   v_desc 
    FROM   table2 
    WHERE id  = 'A' || input_id  
           AND ROWNUM = 1; -- only needed if there are multiple rows for each id. 
    RETURN v_desc; 
END replace_value;

Możesz także dodać obsługę wyjątku dla NO_DATA_FOUND lub INVALID_NUMBER

0
Kaushik Nayak 5 czerwiec 2018, 04:48