Call another script inside PL/SQL - plsql

I am trying to call a variable script name. I need it as a variable so that i can replace it with a parameter. This code below somehow dose not work.
DECLARE
mypath CHAR(30);
BEGIN
mypath := '&1';
#mypath
END;
Any help please!

PL/SQL scripts is a subset of Sqlplus scripts. In other words you cannot run PROMPT hello from inside of PL/SQL block.
Although there's a way to run pure PL/SQL script stored in a file from PL/SQL block, I don't recommend it, because with a little thinking you're able to find more clear solution.
Anyway here's that dirty hack:
my/lovely/little_script_1.sql
BEGIN
dbms_output.put_line('hello from little_script_1');
END;
--------------------
my/lovely/little_script_2.sql
BEGIN
dbms_output.put_line('hello from little_script_2');
END;
--------------------
#main.sql
DECLARE
v_file_contents varchar2(32767) := q'[
#&1
]';
BEGIN
EXECUTE IMMEDIATE v_file_contents
END;
/
--------------------
#run.sql
set serveroutput on
#main.sql my/lovely/little_script_1.sql
#main.sql my/lovely/little_script_2.sql
--------------------
sqlplus user/pass#DB #run.sql
Notice, that little_script* files are pure PL/SQL, particularly they lack the / symbol in the end.
It's important to understand that construct #file_name.sql inlines file contents into current script if only # is the first non-space character in the line regardless of where this construct is placed. Also it takes place even inside PL/SQL - it's an undocumented feature (or a bug which never will be fixed).
So an implicit result of substitution #main.sql my/lovely/little_script_1.sql will be:
DECLARE
v_file_contents varchar2(32767) := q'[
BEGIN
dbms_output.put_line('hello from little_script_1');
END;
]';
BEGIN
EXECUTE IMMEDIATE v_file_contents
END;
Since file contents are just being inlined as is, mind handling quotes correctly.
For instance, if little_script_1.sql contains anywhere a string terminator symbols ]', then main.sql will face a syntactic error - try it yourself.

echo on
set lines 200 pages 999 trims on echo on feed on timing on time on
spool '&1'
#'&2'
spool off
spool '&1' APPEND
DECLARE
myoption CHAR(1);
BEGIN
myoption := '&Do_you_want_to_commit_y_n';
if myoption = 'y' thenQ
commit;
else
rollback;
end if;
END;
/
spool off
set echo off
exit;

Related

Procedure PL/SQL without parameters

I want to create a procedure without parameters (In SQL DEVELOPER) but I am not sure how to do it, I have tried it in the following way and it sends me an error in "Num1 NUMBER";
create or replace package PK_MAC as
PROCEDURE PR_PRUEBAS
IS
Num1 NUMBER;
BEGIN
Num1 := 2;
end;
end;
You're trying to create a procedure or a package, with a procedure?
Here is a working example of what you're doing, as a package.
Your package will have two parts, a SPEC and a BODY.
The SPEC will publicly share the definition of the procedure and the variable, NUM1.
The BODY will define what the procedure actually does. Since NUM1 is defined already in the context of the package in the spec, I can use it in my procedure in the body.
create or replace package PK_MAC as
num1 integer;
PROCEDURE PR_PRUEBAS;
end;
/
create or replace package body PK_MAC IS
procedure pr_pruebas is
BEGIN
Num1 := 2;
end pr_pruebas;
end PK_MAC;
/

How to run the procedure

CREATE OR REPLACE PROCEDURE NG_ZAPIN_FTRREPORT
(
WI_NAME IN VARCHAR2
)
AS
OUT_RESULT VARCHAR2(10);
BEGIN
OUT_RESULT:= 'SELECT * FROM NG_ZAPIN_FTRCHECKLIST WHERE WI_NAME := ''||WI_NAME||''';
END;
This is a sample procedure written by me.
Help me how to run this procedure with passing paramter and getting the query output
EXEC NG_ZAPIN_FTRREPORT('wi_name');
where wi_name is the value of WI_NAME that you want, although I'm pretty sure that your procedure isn't going to work in the way that you expect (but that is a different question).

How do I use “separate" keyword

I am unable to figure out keyword separate in Ada and its depth concept. Please help me to understand by giving a small example?
Lets say I have a nested procedure
with ada.text_io; use ada.text_io;
procedure main is
procedure proc is
begin
put_line ("i am proc");
end proc;
begin
put_line ("main");
end main;
How to use separate keyword ?
You primarily use the separate keyword to achieve one of 2 effects.
OS specific actions. (Put 2 versions of the procedure / functions in different directories, and compile for 2 different targets)
Separation of a lengthy procedure from surrounding code.
Here is an example to show the syntax.
package_x.ads
package Package_X is
procedure Foo;
procedure Sep;
end Package_X;
package_x.adb
package body Package_X is
procedure Foo is
begin
null;
end Foo;
procedure Sep is separate;
end Package_X;
package_x-sep.adb
separate (Package_X) procedure Sep is
begin
null;
end Sep;
The separate keyword creates a unit of compilation, a subunit, that is compiled independently. The parameter of separate refers to the package in which the subunit is a sub unit of.
So if you had a package body X, then you remove procedure Y from it, you create a sub unit of X by creating a new file in which you place Y, and put "separate(X)" at the start of the file, to indicate that Y is really part of X.

Error "BIND VARIABLE "A" NOT DECLARED" when running PL/SQL block

When running the following code in Oracle 10g (pl/sql)
DECLARE
A NUMBER;
B NUMBER;
BEGIN:
A:=&N;
B:=&M;
IF (A>B)
DBMS_OUTPUT.PUT_LINE('THE MAXIMUM OF TWO NUMBER IS:' || TO_CHAR(A));
ELSE
DBMS_OUTPUT.PUT_LINE('THE MAXIMUM OF TWO NUMBERS IS:' || TO_CHAR(B));
END IF;
END;
I get the error 'BIND VARIABLE "A" NOT DECLARED' and I don't know why. What is causing this?
There are a couple of things wrong with your code.
The first problem is that there should be no colon after BEGIN. What you've written is being interpreted by Oracle as BEGIN :A := ..., and that should explain why you're getting an error about bind variable A.
The second problem is with the line IF (A>B). You need to add a THEN to the end.
Incidentally, you can use GREATEST(A, B) to return the larger of two numbers.

PL/SQL script giving errors

I've to work on some older EDW scripts, which I think are in PL/SQL and queries fech data from Oracle table as well. But there is some problem with them, the part which declares variables, as shown in the image gives error. I'm unable to understand why?
Below is some part of script,
VARIABLE begin_exp_date varchar2(8)
VARIABLE end_exp_date varchar2(8)
VARIABLE begin_cal_key number
Declare
begin
:begin_exp_date := 'begin_exp_date';
:end_exp_date := 'end_exp_date';
:begin_cal_key := 'begin_cal_key';
end;
These lines produce error ORA-00900: Invalid SQL statement.
Any help?
If you plug the script in SQL*Plus, it will be executed without the ORA-00900 error. I guess you received the error when it was run in Toad.
If it is indeed PL/SQL, it should be more like this
DECLARE
begin_exp_date varchar2(8);
end_exp_date varchar2(8);
begin_cal_key number;
BEGIN
begin_exp_date := 'begin_exp_date';
-- and so on
END;
You can set constant values to the variables in the DECLARE section if you want. Note that you've defined begin_cal_key as a NUMBER so cannot assign the string 'begin_cal_key'

Resources