CREATE TABLE testname
(
ID NUMBER,
Name VARCHAR2(100)
);
INSERT INTO TestName(id, name) VALUES (1, 'Ivan');
INSERT INTO TestName(id, name) VALUES (2, 'Stepan');
INSERT INTO TestName(id, name) VALUES (3, 'Sidor');
COMMIT;
CREATE OR REPLACE PACKAGE TestNamePck IS
-- ID
FUNCTION GetNameByID(pID NUMBER) RETURN VARCHAR2;
END TestNamePck;
/
CREATE OR REPLACE PACKAGE BODY TestNamePck IS
--
CURSOR TestCur IS
SELECT * FROM TestName;
SUBTYPE TTestName IS TestName%ROWTYPE;
TYPE TTestName_ByID IS TABLE OF TTestName INDEX BY VARCHAR2(38);
myTestName TTestName;
TestName_ByID TTestName_ByID;
-- ID
FUNCTION GetNameByID(pID NUMBER) RETURN VARCHAR2 IS
BEGIN
IF TestName_ByID.EXISTS(TO_CHAR(pId)) THEN
RETURN TestName_ByID(TO_CHAR(pId)) .Name;
ELSE
RETURN NULL;
END IF;
END;
--
BEGIN
OPEN TestCur;
FETCH TestCur INTO myTestName;
WHILE TestCur%found LOOP
TestName_ByID(TO_CHAR(myTestName.ID)) := myTestName;
FETCH TestCur INTO myTestName;
END LOOP;
CLOSE TestCur;
END TestNamePck;
/
SQL> set serveroutput on;
SQL> set feedback off;
SQL>exec dbms_output.put_line(testnamepck.getnamebyid(pid => 1));
Ivan
SQL>exec dbms_output.put_line(testnamepck.getnamebyid(pid => 2));
Stepan
SQL>exec dbms_output.put_line(testnamepck.getnamebyid(pid => 3));
Sidor
SQL>
Source: https://habr.com/ru/post/37027/
All Articles