This the procedure I have written in Toad (Oracle 19c):
CREATE OR REPLACE PROCEDURE ITMS.SP_ADD_FOREIGN_KEY_CONSTRAINT_AUTO (
P_TABLE_NAME VARCHAR2,
P_COLUMN_NAME VARCHAR2)
IS
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE '
|| P_TABLE_NAME
|| ' ADD CONSTRAINT '
|| P_TABLE_NAME
|| '_'
|| SUBSTR(P_COLUMN_NAME,1, INSTR(P_COLUMN_NAME,'_ID')-1)
|| '_FK FOREIGN KEY ('
|| P_COLUMN_NAME
|| ') REFERENCES '
|| SUBSTR(P_COLUMN_NAME,1, INSTR(P_COLUMN_NAME,'_ID')-1)
|| '(ID)';
END;
I have created the above procedure which is executing fine in toad for Oracle with query:
EXEC SP_ADD_FOREIGN_KEY_CONSTRAINT_AUTO('DTMS_BA_VOLUME_DISCOUNT_DETAILS','REF_BUSINESS_ASSOCIATE_ID')
where I have written all query in single line.
but if I execute like this :
EXEC SP_ADD_FOREIGN_KEY_CONSTRAINT_AUTO('DTMS_BA_VOLUME_DISCOUNT_DETAILS',
'REF_BUSINESS_ASSOCIATE_ID') `
Where I have written some part of query in next line. I am getting error -
ORA-06550: line 1, column 76:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
Can you please tell why I am getting this?
This is not an SQL or Oracle issue or anything to do with the procedure or dynamic SQL, it is an issue that the client application is behaving exactly as documented when it sends a command to the database but it does not meet your expectation of how it should behave.
From the SQL*Plus documentation on the
EXECUTEcommand:As the documentation implies; the
EXECUTEcommand expects yourstatementto fit onto a single line so when it encounters a line break it expectsstatementto be a complete PL/SQL statement and will send that statement to the database for it to parse. The database is returning the appropriate error because it is being sent the command:and the command is syntactically invalid as it has an open bracket but no closing bracket.
Everything is behaving exactly as the documentation states it should.
As the documentation states, if you do want to have a command spanning multiple lines then you need to use the SQL*Plus continuation character (a hyphen).