Solved

dynamically creating view in a stored procedure

Posted on 2013-07-01
5
420 Views
Last Modified: 2013-07-22
How do I create a view in a stored procedure.  The stored procedure is passed a parameter, for example an id,  I will need to create the view name from this id and create the select statement using the id as a parameter in the where clause.  How is this done?


create replace sp_create_view(p_id number)

as

string = 'create view dyn' + p_id ' as
               select col1,
                          col2

               from table where table.id = p_id;'
0
Comment
Question by:cookiejar
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 2
  • 2
5 Comments
 
LVL 77

Expert Comment

by:slightwv (䄆 Netminder)
ID: 39291297
First, I strongly encourage you to not do DDL in a procedure.

What is the view supposed to save you?

That said, given the example above (you have a typo):

string := 'create view dyn' + p_id ' as
               select col1,
                          col2

               from table where table.id = ' || p_id;

--after you build the string
execute immediate string;
0
 
LVL 35

Accepted Solution

by:
YZlat earned 500 total points
ID: 39291501
Try something like that:

PROCEDURE usp_create_view(p_id NUMBER) IS
   v_sql LONG;
BEGIN
   v_sql := 'CREATE VIEW dyn'||p_id ||' AS SELECT col1, col2, FROM TABLE WHERE TABLE.id='||p_id||';'
   DBMS_OUTPUT.PUT_LINE('v_sql: ' || v_sql);
   EXECUTE IMMEDIATE v_sql;
END; 

Open in new window

0
 
LVL 77

Expert Comment

by:slightwv (䄆 Netminder)
ID: 39291657
>>v_sql LONG;

NEVER use LONG's.  Use a CLOB.

>>id='||p_id||';'

I believe adding the semi-colon as part of the actual statement will generate a:
ORA-00911: invalid character



All that said, isn't that pretty much what I posted?
0
 
LVL 49

Expert Comment

by:PortletPaul
ID: 39292245
>>I will need to create the view name from this id and create the select statement using the id as a parameter in the where clause.
WHY?

what do you possibly gain by building a view, then using that view as part of a select?

just go to the select and bypass the create/replace of the view

seems to me you have the impression that this will (somehow) be more efficient - it won't be
also seems to me you feel that a parameter is a necessary part of efficiency - it isn't
(a 'where clause' on a STATIC view could be just as efficient, perhaps more so)

Would you describe what it is you are trying to achieve please?

and although I really don't like the sound of this, if you are going to proceed down this path, use:
CREATE OR REPLACE VIEW ...
0
 
LVL 35

Expert Comment

by:YZlat
ID: 39294243
slightwv, you posted

string := 'create view dyn' + p_id ' as
               select col1,
                          col2

               from table where table.id = ' || p_id;
0

Featured Post

Ready to get started with anonymous questions?

It's easy! Check out this step-by-step guide for asking an anonymous question on Experts Exchange.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Working with Network Access Control Lists in Oracle 11g (part 1) Part 2: http://www.e-e.com/A_9074.html So, you upgraded to a shiny new 11g database and all of a sudden every program that used UTL_MAIL, UTL_SMTP, UTL_TCP, UTL_HTTP or any oth…
From implementing a password expiration date, to datatype conversions and file export options, these are some useful settings I've found in Jasper Server.
This video shows how to recover a database from a user managed backup
Via a live example, show how to restore a database from backup after a simulated disk failure using RMAN.
Suggested Courses

617 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question