Reputation: 21
I am fairly new to Oracle SQL. I am trying to create a stored procedure which takes 2 parameters. I am getting errors when I save below. Any idea ?
CREATE OR REPLACE PROCEDURE SWAP_VIEWS
(
SchemaName NVARCHAR,
TableName NVARCHAR
) AS
BEGIN
DECLARE SQLstring NVARCHAR :=
'ALTER VIEW AS POL.V_' + TableName + ' as SELECT * FROM ' + SchemaName + '.' + TableName
EXEC SQLstring;
END SWAP_VIEWS ;
Upvotes: 2
Views: 27009
Reputation: 222462
You seem to be mixing SQL Server and Oracle syntax here:
Oracle uses standard operator ||
for string concatenation, not +
Oracle wants EXECUTE IMMEDIATE
instead of EXEC
you need CREATE OR REPLACE VIEW
NVARCHAR2
should be preferred to NVARCHAR
Note that you don't need an intermediate variable assignment, you can concatenate the query string and execute it at once.
Consider:
CREATE OR REPLACE PROCEDURE SWAP_VIEWS (
pSchemaName NVARCHAR2,
pTableName NVARCHAR2
) AS
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW AS POL.V_'
|| pTableName + ' as SELECT * FROM '
|| pSchemaName || '.' || pTableName;
END;
/
Upvotes: 3
Reputation: 3316
I have taken your procedure and modified like below, see if it works. Additionally i want to say, you can explicitly do exception handling in the procedure to capture any error during the execution and also creating view with '*' has some disadvantages. Please chek
CREATE OR REPLACE PROCEDURE SWAP_VIEWS
(
p_schema_name IN NVARCHAR2,
p_table_name IN NVARCHAR2
)
IS
lo_sql_string NVARCHAR2(4000);
lo_view_name NVARCHAR2(30);
lo_table_name NVARCHAR2(30);
BEGIN
-- I just prefer local variables for convenience to avoid more complex string in actual one and also for debugging purpose
lo_view_name := 'POL.V_'||p_table_name;
lo_table_name := p_schema_name||'.'||p_table_name;
lo_sql_string:= 'create or replace view '||lo_view_name||
' as '||
'select * from '||lo_table_name;
EXECUTE IMMEDIATE lo_sql_string;
END SWAP_VIEWS;
/
Upvotes: 0
Reputation: 8518
Here the version corrected
CREATE OR REPLACE PROCEDURE SWAP_VIEWS
(
SchemaName NVARCHAR,
TableName NVARCHAR
) AS
SQLstring varchar2(4000);
BEGIN
SQLstring := 'CREATE OR REPLACE FORCE VIEW POL.V_' || TableName || ' as SELECT * FROM ' || SchemaName || '.' || TableName ' ;
EXECUTE IMMEDIATE SQLstring;
END SWAP_VIEWS ;
/
Upvotes: 2