0

When creating a package body i cannot have a select from another db link inside the package body? I dont know the value of the dblink name from before therefore

Create or replace package body sth as 
 procedure getvalues(linkname in char)
 is
 begin
 select col1 from table1@linkname;
end getvalues;
end sth;

When i create this i get that table or view does not exist.. The link name i dont know it from before hand its in parameter which will be used as:

getvalues(linkname => dbname);

How can you have these values inside the package body?

George Georgiou
  • 455
  • 2
  • 14
  • 27

1 Answers1

4

If you don't know the name of the database link at compile time, you'd need to use dynamic SQL. Regardless of whether you're using dynamic SQL or static SQL, though, a procedure can't just run a SQL statement. It would have to do something with the results. You could open a sys_refcursor either as a local variable or as an OUT parameter. You could iterate through the results, fetching the data and doing something with the results. The fact that you have declared a procedure rather than a function implies that you want to modify the database state somehow rather than simply returning a sys_refcursor. But the name of the procedure implies that maybe you really want a function that returns a sys_refcursor.

If you really want a function that returns a sys_refcursor

CREATE OR REPLACE FUNCTION getValues( p_dblink IN VARCHAR2 )
  RETURN SYS_REFCURSOR
IS
  l_rc SYS_REFCURSOR;
BEGIN
  OPEN l_rc FOR 'SELECT col1 FROM table1@' || p_dblink;
  RETURN l_rc;
END;
Justin Cave
  • 227,342
  • 24
  • 367
  • 384