Question

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?

Was it helpful?

Solution

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;
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top