konto usunięte

Temat: Funkcja w Oracle bez zdefiniowanego typu argumentu

Czesc,

chciałbym stworzyć funkcję, która w zalezności od typu argumentu (data, liczba, tekst) wykonuje różne działania na argumencie.
W poniższym opisie nie ma mowy o braku podania typu zmiennej.
Jak zatem osiągnąć powyższy cel uzywając tylko jednej zmiennej jako argumentu?

Pozdrawiam,
Piotrek

CREATE OR REPLACE FUNCTION <function_name> (
<parameters> [IN | OUT | IN OUT] [NOCOPY] <data_type>)
RETURN <data_type> [AUTHID <CURRENT_USER | DEFINER>] IS

<constant, exception, and variable declarations>

BEGIN
<code_here>;
END <function_name>;

konto usunięte

Temat: Funkcja w Oracle bez zdefiniowanego typu argumentu

Możesz utworzyć kilka z taką samą nazwą, różniących się typem parametru wejściowego:
CREATE OR REPLACE FUNCTION test(par NUMBER) RETURN NUMBER
CREATE OR REPLACE FUNCTION test(par VARCHAR2) RETURN NUMBER
CREATE OR REPLACE FUNCTION test(par DATE) RETURN NUMBERPaweł Idczak edytował(a) ten post dnia 19.08.11 o godzinie 17:13

Temat: Funkcja w Oracle bez zdefiniowanego typu argumentu

A może zdefiniować typ i go przekazywać:


CREATE TYPE par AS OBJECT (

tekst VARCHAR2,
liczna NUMBER,
czas DATE
);

//-----

CREATE OR REPLACE FUNCTION test(war par) RETURN ...
Kamil Stawiarski

Kamil Stawiarski Oracle Certified
Master | Oracle ACE

Temat: Funkcja w Oracle bez zdefiniowanego typu argumentu

Witam,
Można też posłużyć się typem SYS.ANYDATA ale należy pamiętać o dokonywaniu potrzebnych konwersji:


SQL> set serveroutput on
SQL> create or replace procedure f_any_arg(x sys.anydata)
2 as
3 begin
4 dbms_output.put_line(sys.anydata.gettypename(x));
5 end;
6 /

Procedure created.

SQL> exec f_any_arg(1);
BEGIN f_any_arg(1); END;

*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00306: wrong number or types of arguments in call to 'F_ANY_ARG'
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored


SQL> exec f_any_arg(sys.anydata.convertnumber(1));
SYS.NUMBER

PL/SQL procedure successfully completed.

SQL> exec f_any_arg(sys.anydata.convertvarchar2('a'));
SYS.VARCHAR2

PL/SQL procedure successfully completed.

SQL> exec f_any_arg(sys.anydata.convertdate(sysdate));
SYS.DATE

PL/SQL procedure successfully completed.


Pozdrawiam,
Kamil.
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: Funkcja w Oracle bez zdefiniowanego typu argumentu

Cześć,

Możesz uzyskać taki efekt dzięki tzw. przeciążaniu operatorów.


CREATE OR REPLACE PACKAGE stringer AS

FUNCTION stringify(p_field IN VARCHAR2) RETURN VARCHAR2;
FUNCTION stringify(p_field IN NUMBER) RETURN VARCHAR2;
FUNCTION stringify(p_field IN DATE) RETURN VARCHAR2;

END;

CREATE OR REPLACE PACKAGE BODY stringer AS

FUNCTION stringify(p_field IN VARCHAR2) RETURN VARCHAR2
IS
BEGIN
RETURN 'String:' || p_field;
END;

FUNCTION stringify(p_field IN NUMBER) RETURN VARCHAR2
IS
BEGIN
RETURN 'Number:' || to_char(p_field);
END;

FUNCTION stringify(p_field IN DATE) RETURN VARCHAR2
IS
BEGIN
RETURN 'Data:' || to_char(p_field, 'DD/MM/YYYY');
END;

END;



SELECT
stringer.stringify('Jan') as imie,
stringer.stringify(25) as wiek,
stringer.stringify(to_date('1983-01-01', 'YYYY-MM-DD')) as urodzony
from dual


Źródło: http://it.toolbox.com/blogs/oracle-guide/overloading-p...



Wyślij zaproszenie do