PL/SQL using dynamic table names
I want to create a procedure in which i want to pass a parameter which after concatenation with a string gives me a variable which is the tablename in my SELECT query in the procedure.
How to do it?
See here for an example using ref cursor.
http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/11_dynam.htm#10037
If this is not what you need, come back and give us more details
Similar Messages
-
Dynamic SQL substituting dynamic table name with slct statement having date
Hello,
I just wanted some help with the following PL block. My problem is whenever I try to run this block it ask for invoking values for 2 substitute variables, though no substitute variables present in the code. Please find the code below:
Declare
cursor C_1 is
select unique table_name from gsi_daily_count;
table_names varchar2(240);
Begin
Open C_1;
Loop
Fetch C_1 into table_names;
EXIT WHEN C_1%NOTFOUND;
EXECUTE IMMEDIATE' select last_extract_date,
to_char(min(greatest(nvl(last_update_date,'||01-Jan-10||'),nvl(program_update_date,'||01-Jan-10||'))),'||DD-MON-YY HH24:MI:SS||') mi,
to_char(max(greatest(nvl(last_update_date,'||01-Jan-10||'),nvl(program_update_date,'||01-Jan-10||'))),'||DD-MON-YY HH24:MI:SS||') ma
from' || table_names ||'
group by last_extract_date
order by last_extract_date desc';
End Loop;
Close C_1;
COMMIT;
End;
Please help.
Thanks in advance.You cannot specify your dates the way you have since they are being intepreted as bind variables:
Try this:
Declare
cursor C_1 is
select unique table_name
from gsi_daily_count;
table_names varchar2(240);
Begin
Open C_1;
Loop
Fetch C_1 into table_names;
EXIT WHEN C_1%NOTFOUND;
EXECUTE IMMEDIATE' select last_extract_date,
to_char(
min(
greatest(
nvl(last_update_date,to_date('''|| '01-Jan-10' ||''',''dd-Mon-yy''))
,nvl(program_update_date,to_date('''|| '01-Jan-10' ||''',''dd-Mon-yy''))
),''DD-MON-YY HH24:MI:SS''
) mi
to_char(
max(
greatest(
nvl(last_update_date,to_date('''|| '01-Jan-10' ||''',''dd-Mon-yy''))
,nvl(program_update_date,to_date('''|| '01-Jan-10' ||''',''dd-Mon-yy''))
),''DD-MON-YY HH24:MI:SS''
) ma
from ' || table_names ||'
group by last_extract_date
order by last_extract_date desc';
End Loop;
Close C_1;
COMMIT;
End;
/ There is not way for me to test this, so you may have to play around with all the quotes! -
Dynamic table name in native SQL
Hi,
How can i use dynamic table name in native SQL?
My req is to select data from a external database table , but the table name will be only poulated during runtime.
How can i acheive this?
Regards,
Arun.It should work OK - see demo below.
Jonathan
report zsdn_jc_adbc_test.
start-of-selection.
perform demo_lookup.
form demo_lookup.
data:
l_error_msg type string,
ls_t001 type t001, "Company
ls_t003 type t003. "Doc types
perform dynamic_lookup
using
'T001'
changing
ls_t001
l_error_msg.
write: / l_error_msg.
perform dynamic_lookup
using
'T003'
changing
ls_t003
l_error_msg.
write: / l_error_msg.
endform.
form dynamic_lookup
using
i_tabname type tabname
changing
os_data type any
o_error_msg type string.
* Use ADBC to select data
data:
l_mandt_ref type ref to data,
l_result_ref type ref to data,
l_mandt type symandt,
l_tabname type tabname,
l_sql_statement type string,
lo_cx_root type ref to cx_root,
lo_cx_sql type ref to cx_sql_exception,
lo_connection type ref to cl_sql_connection,
lo_statement type ref to cl_sql_statement,
lo_result_set type ref to cl_sql_result_set.
clear: os_data, o_error_msg.
get reference of l_mandt into l_mandt_ref.
get reference of os_data into l_result_ref.
l_mandt = '222'. "i.e. select from client 222
l_tabname = i_tabname.
try.
lo_connection = cl_sql_connection=>get_connection( ).
lo_statement = lo_connection->create_statement( ).
* Set criteria for select:
lo_statement->set_param( l_mandt_ref ).
concatenate
'select * from' l_tabname
'where mandt = ?'
into l_sql_statement separated by space.
* Execute
call method lo_statement->execute_query
exporting
statement = l_sql_statement
hold_cursor = space
receiving
result_set = lo_result_set.
* Get the data from the resultset.
lo_result_set->set_param_struct( l_result_ref ).
while lo_result_set->next( ) > 0.
write: / os_data.
endwhile.
* Tidy up:
lo_result_set->close( ).
lo_connection->close( ).
catch cx_sql_exception into lo_cx_sql.
o_error_msg = lo_cx_sql->get_text( ).
catch cx_root into lo_cx_root.
o_error_msg = lo_cx_root->get_text( ).
endtry.
endform. -
Problem with Dynamic Table Name
Hello all,
I am having trouble using a dynamic table name. I have the following code.....
declare l_cur sys_refcursor;
l_ID int;
l_tableName varchar(30);
BEGIN
open l_cur for
select hkc.ColumnID, mapping from &HKAPPDB_Schema_Name..doctablemapping ddm
inner join &HKDB_Schema_Name..HKColumns hkc on hkc.doctablemappingid = ddm.id
where ddm.id > 0;
LOOP
FETCH l_cur into l_ID, l_tableName;
EXIT WHEN l_cur%notfound;
-- update missing VerbID in DocumentDocMapping table
UPDATE &HKAPPDB_Schema_Name..IndexedDocument
SET VerbID = (SELECT t.VerbID
FROM (SELECT DocRef, VerbID, DateUpdated
FROM &HKAPPDB_Schema_Name..l_tableName dd - this is where the dynamic table name is used
WHERE dd.VerbID is not NULL))
WHERE HKColumnID = l_ID AND VerbID is NULL;
END loop;
end;
/When I try to execute this i get an error
ORA-00942: table or view does not exist
What am I doing wrong?
Regards,
Tobyredeye wrote:
I only started about 6 weeks ago, with no tutorials and learning it on the fly; Same here.. only my introduction was to a 12 node Oracle OPS cluster all those years ago.. and required a whole new mind set after using SQL-Server extensively. But it was fun. Still is. :-)
but thats what you get when a company throws you in at the deep end with a ridiculous time constraint to migrate a whole MSSQL DB.Migrating SQL-Server to Oracle is not a simple thing. A lot of best practices in SQL-Server are absolutely worse practices in Oracle - they are that different. Simple example is lock escalation - an issue in SQL-Server. In Oracle, the concept of a lock being escalated into a page lock simply does not exist.
In terms of getting the migration done as quickly and painlessly as possible I try to reuse all the logic as it appears in the MSSQL code - in this case it was using dynamic table names. I do not doubt that i am probably shooting myself in the foot in the long run.....As long as you do not splatter too much blood on us here.. not a problem :D
Seriously though - just keep in mind that what works in SQL-Server may not work as well (or even at all) in Oracle. So do not hesitate to refactor (from design to code to SQL) mercilessly when you think it is warranted. -
Dynamic table name from Arguments in cfquery /
I'm trying to use dynamic table names in a cfc but seem to
have hit upon a wall as my calling methods from flash keep hitting
my _error methods - Code attached to show what I'm trying to
achieve; if anyone can give me some pointers it would be a great
help. I've seen numerous by using the Form with the arguments but
this is coming into a gateway used by a flash component and doesn't
work no matter how much I fiddle the code.
Thanks in advanceThere was a time when I needed a dynamic query such as this.
BUT, it is very dangerous, which is why I took a few steps to make
it more secure.
1. Always use cfqueryparam and strict datatyping
2. Use listFindNoCase for known table names in the database
e.g
<cfset variables.tableNames =
"items,products,categories,blog" />
<cfif
listContainsNoCase(variables.tableNames,lCase(trim(arguments.tableName)),",")>
query here
<cfelse>
Error: Unknown table requested
</cfif>
Mikey -
(Urgent) Dynamic Table Name
Hi Fellows,
Can I use dynamic table name in a loop? I have a problem that I want to use variable table in a cursor for example
procedure check_rows as
cursor c1 is
select view_name
from user_views;
v_count number;
v_view_name varchar2(35);
begin
for i in c1 loop
select count(*)
into v_count
from i.view_name;
if v_count = 0 THEN
dbms_output.put_line ('The View '| |i.view_name| |' has no rows');
end if;
end loop;
end;
but i receive a message
i.view_name must a name of a table to which the user has access.
Can anybody solve my problem.
Thanks in advance
MustafaHere is some codes I wrote with DBMS_SQL. I hope it will help you to start.
PROCEDURE Get_record(p_select IN OUT select_rec, where_str IN OUT varchar2) IS
my_keyblk varchar2(6);
veh_id integer;
ser_date date;
succ_flag number;
blk_route varchar2(4);
blk_run integer;
my_date_type integer;
cur_blk_route INTEGER;
rows_processed INTEGER;
ignore integer;
select_str varchar2(3000);
First_date date;
Last_date date;
BEGIN
begin
select start_date, end_date into first_date, Last_date from change_date
where current_next_code = 'CURRENT';
exception when others then
null;
end;
select_str := 'select keyblock, keycoach, proflag, pullout_date
from logblock
where (pullout_date between first_date and Last_date)
and proflag = 0';
cur_blk_route := dbms_sql.open_cursor;
dbms_sql.parse(cur_blk_route, select_str, dbms_sql.v7);
dbms_sql.define_column(cur_blk_route, 1, blk_route, 6);
dbms_sql.define_column(cur_blk_route, 2, blk_run);
dbms_sql.define_column(cur_blk_route, 3, veh_id);
dbms_sql.define_column(cur_blk_route, 4, ser_date);
ignore := dbms_sql.execute(cur_blk_route);
LOOP
if (dbms_sql.fetch_rows(cur_blk_route) > 0) then
dbms_sql.column_value(cur_blk_route, 1, blk_route);
dbms_sql.column_value(cur_blk_route, 2, blk_run);
dbms_sql.column_value(cur_blk_route, 3, veh_id);
dbms_sql.column_value(cur_blk_route, 4, ser_date);
else
dbms_output.put_line('ERROR ');
end if;
END LOOP;
dbms_sql.close_cursor(cur_blk_route);
END Get_record;
end apc_block_assign;
null -
How to set dynamic table name in sql query?
I want set dynamic table name by parameter in sql query,just like:
select * from :tbname
but run report is error,BI P report table name is invalidation.
What can i do? Thanks!Hi,
that's only possible inside a data template with a lexical parameter.
Regards
Rainer -
Dynamic table name in native sql query
Can i pass a dynamic table name in this query ---
EXEC SQL PERFORMING APPEND_MTO.
SELECT
LTOG_QUANTITY_TYPE,
FCONO,
WBSELEMENT,
PROJECT
INTO :IMTO
FROM RWORKS.MTO_ISO_V2
WHERE LTOD_DATE > TO_DATE(:MAXD,'YYYYMMDDHH24MISS')
ENDEXEC.
How can i pass this table name RWORKS.MTO_ISO_V2 dynamically in the query
Edited by: Madhukar Shetty on Nov 26, 2009 2:40 PMCan i pass a dynamic table name in this query ---
EXEC SQL PERFORMING APPEND_MTO.
SELECT
LTOG_QUANTITY_TYPE,
FCONO,
WBSELEMENT,
PROJECT
INTO :IMTO
FROM RWORKS.MTO_ISO_V2
WHERE LTOD_DATE > TO_DATE(:MAXD,'YYYYMMDDHH24MISS')
ENDEXEC.
How can i pass this table name RWORKS.MTO_ISO_V2 dynamically in the query
Edited by: Madhukar Shetty on Nov 26, 2009 2:40 PM -
Dynamic table name in select statment
hai,
Please help me....
oracle 9i i am using.
i have four tables abc_121,
abc_122,
abc_123,
abc_124.
i want to pick records from a table.table name should be prepared dynamically.
i.e., i want to pick records from a quarter table of this year.(ex: abc_124). using sql statement only.
i have tried..but i couldn't...... pls help me...ramadurga.v wrote:
oracle 9i i am using.
i have four tables abc_121,
abc_122,
abc_123,
abc_124.
i want to pick records from a table.table name should be prepared dynamically.
i.e., i want to pick records from a quarter table of this year.(ex: abc_124). using sql statement only.Create a partition view. E.g.
create or replace view abc as
select * from abc_121
union all
select * from abc_122
union all
...For the partition view approach to correctly work (doing "partition pruning"), you need to have a constraint on the column that identifies that partition.
In other words, you cannot use the table name as an attribute to identifies its data content. Foe example, you can have tables YEAR2001_Q1 and YEAR2001_Q2. However, the year and quarter also need to be in the table itself - e.g. columns YEAR and QUARTER.
For table YEAR2001_Q1, the YEAR column needs to have a check constraint that ensures it is always 2001. And a check constraint for column QUARTER to ensure that it is always 1.
If these conditions are met, then a select from the partition view using +"where YEAR=2001 and QUARTER=2"+ will result in only table YEAR2001_Q2 to be used and not other tables like YEAR2001_Q1.
See {message:id=10539404} for an example. -
Passing dynamic table name in ADO. net destination
I am new to SSIS and I have a requirement where i need to pass dynamic table name in ADO .net destination .
My package contains an "Execute Sql task" in the control flow which computes the destination table name to be provided at run time and stores it in a variable expression
"@[User::Table_name]"(which has a scope of full package).
Now, the problem I'm facing right now is that , I am unable to use this variable expression in the ADO .Net Destination .
I need to pass this variable expression as the table name in ado .net destination.
But, whenever I use this variable in place as the table name I keep on getting this error and my package fails:-
[ADO NET Destination [403]] Error: The Table or View name is not expected. \n\t If you are quoting the table name, please use the prefix " and the suffix " of your selected data provider for quotation. \n\t If you are using multipart name,
please use at most three parts for the table name.
Although ,I am able to run my package when i am providing the existing(static) table name.So there is nothing wrong with the package.
Tried a lot of things still not working..Please help...I am having the result stored in the variable expression . I just need a way to be able to use it as the Destination table in ADO .net Destination.
I am not sure if this will work for you, but I am able to store the table name in variable and use it dynamically (via data flow task expression property ) as shown.
Thanks, hsbal
Hi Adeep,
Based on my further research, just as hsbal said, we can set a variable as ADO.NET Destination table via Expressions property in Data Flow Task.
If there are any other questions, please feel free to ask.
Thanks,
Katherine Xiong
Katherine Xiong
TechNet Community Support -
After run (or test) of procedure
create or replace procedure tmp_select_dymanic
( AInTable IN VARCHAR2,
ACount OUT NUMBER
) as
begin
EXECUTE IMMEDIATE 'BEGIN SELECT count(*) INTO :Count FROM :InTable END;'
USING ACount, AInTable;
end tmp_select_dymanic;
error message: invalid table name.
I know the table exists and contains data. I can make SELECT in SQL (not dynamic).
What a reason for error? May be privileges in database? But i make SELECT on my own table?
How can i set dynamic table name in other way?
My Oracle Version 10g.What you are asking can be done by REF_CURSOR;
look this example and try your self the rest:
CREATE OR REPLACE PROCEDURE insert_to_table_dinamic (
table1 IN VARCHAR2,
table2 IN VARCHAR2
AS
rc sys_refcursor;
v_sql VARCHAR2 (2000);
v_deptno NUMBER;
BEGIN
v_sql :=
'SELECT DEPTNO FROM '
|| table1
|| ' WHERE ROWNUM = 1 AND DEPTNO IS NOT NULL';
OPEN rc FOR v_sql;
LOOP
FETCH rc
INTO v_deptno;
EXIT WHEN rc%NOTFOUND;
v_sql :=
'UPDATE '
|| table2
|| ' SET DEPTNO = '
|| v_deptno
|| ' WHERE DEPTNO IS NULL';
EXECUTE IMMEDIATE v_sql;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLCODE || SQLERRM);
END insert_to_table_dinamic;when i give DEPT , EMP as my 2 parameters above code will set the deptno in EMP table where deptno is null;
--Just a test proc. -
Dynamic table name in an inner join - select statement
Hi,
Please can you let me know if is possible to use a Dynamic table name in an inner join?
Something like the statement below? (It works in a simple select statement but not in an inner join)
SELECT *
INTO CORRESPONDING FIELDS OF <t_itab>
FROM <Dynamic table name> INNER JOIN pa0050 ON
( <Dynamic table name>pernr = pa0050pernr )
WHERE <Dynamic table name>~pernr = it_pernr-l_pernr
AND pa0050~bdegr = f_bdegr.
Any help would be apprecited very much.
Thanks & Regards.Hi,
Check this link.
[http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb39c4358411d1829f0000e829fbfe/frameset.htm]
[Re: accessing dynamic internal table's fields??;
hope it'll help u.
Regards,
Sneha.
Edited by: sneha kumari on Jun 18, 2009 1:57 PM -
Dynamic Table name in Inner Join in 4.6c
data: tab1(10) type c value 'MARA',
tab2(10) type c value 'MAKT'.
data: dbtab1(10) type c,
dbtab2(10) type c .
dbtab1 = tab1.
dbtab2 = tab2.
DATA: BEGIN OF itab occurs 0,
matnr TYPE mara-matnr,
maktx type makt-maktx,
END OF itab.
DATA: column_syntax TYPE string,
dbtab_syntax TYPE string.
PARAMETERS: p_matnr TYPE mara-matnr.
dbtab_syntax = '( (dbtab1) AS t1 '
&' INNER JOIN (dbtab2) AS t4 ON t1MATNR = t4MATNR )'.
SELECT matnr maktx
FROM (dbtab_syntax)
INTO TABLE itab WHERE t4~matnr = p_matnr.
Got the following error:
"A table name, specified in an SQL command, is unknown"
It seems not able to read dynamic table name in dbtab_syntax.
thanks
anya
Moderation Message: Duplicate Post.
Edited by: kishan P on Nov 29, 2010 11:17 AMHi,
Check this link.
[http://help.sap.com/saphelp_nw04/helpdata/en/fc/eb39c4358411d1829f0000e829fbfe/frameset.htm]
[Re: accessing dynamic internal table's fields??;
hope it'll help u.
Regards,
Sneha.
Edited by: sneha kumari on Jun 18, 2009 1:57 PM -
Import Data using Full Table Name
Is there a way to run the import data wizard so when pulling data from a csv it generates an insert statement not only using the table name but using the Oracle Schema name -- ie fully qualified table name?
Hi Nilanjan,
I need help ASAP.
About this dump-load task, how does it works? Because I was checking out a package called Import SQL and this one only imports data from a table, however this table has to be allocated within the database that is being used, and I right? Are these 2 related somehow?
Does this task order BPC to find data from a SQL Table (allocated in a different server, different instance for SQL) and import it to SQL Fac2 table?
Can you help me with a simple explanation what do I need to do to run this task? The page help.sap.com talks shows a section within DumpLoad Task Usage which is called Importing Into SQL Server...
* Processing the Application using DumpLoad -
Importing into SQL
You can use DumpLoad to process the application as a standalone procedure, or with data import, export, or clear.
Prerequisites
The DumpLoad task (OsoftTaskDumpLoad2008.dll) is registered with Microsoft SSIS. See Registering Custom Tasks.
Procedure
1.Open a package or create a new package in Microsoft SSIS on the Planning and Consolidation server. i already did this for the DumpLoad task ... should I do this for the Import SQL task also ?
2.Select the task and add it to the package. WHAT DOES SELECT THE TASK MEAN?
3.Open the task, and choose Data Management None .
4.Enter the application set, application, and user ID.
Im getting confused, can you please provide more details about the whole procedure. Thanx in advance
Velázquez -
Cannot use duplicate table name error in AMDP
Hi Experts,
I'm developing an application which has the following architecture
SAP UI5->Gateway->ABAP Managed DB procedures(AMDP)->HANA SP(Stored Procedure)
We are having a very peculiar problem where the gateway service works inconsistently for the same input data.
i.e If I execute the same service n number of times, I get the results successfully for say n-3 times but the other 3 times I get a "RFC Error :Error while executing Database procedure"
There is no change in the input data or DB table data during all the executions.
Running the stored procedure stand alone in HANA studio works all the time.
We tried executing the AMDP from SE24 and the same behavior occurred.
When trouble shooting we found that the exception occurs inside the AMDP when the call db procedure statement is executed.
Could you please advise what could be the possible reason for this any tuning parameter/unavailability of db connections?
Or could you please suggest some other troubleshooting mechanism by which we can zero in on the cause?
When I go in the debug mode I can see the exact error as
cannot use duplicate table name: [288] SAPXXX.ZCL_PLAN_MAINTENANCE=>GET_COMP_TYPE#stub#20140905055908: line 15 col 3 (at pos 492): cannot use duplicate table name exception:
where ZCL_PLAN_MAINTENANCE=>GET_COMP_TYPE is the AMDP class and method. SAPXXXis the schema.I reported this to Adobe customer support on 11/29, and here is their response:
Wednesday, December 5, 2007 12:51:27 PM PST
Hello John,
Thank you for contacting Adobe® Web Support for assistance with Adobe
Photoshop Elements® 6.0.
I understand that images are deleted if you accidentally try to move
them to a folder that already includes a file of the same name.
Thank you for bringing this to our attention. I was able to replicate
this behavior as well. The best method to report errors of this nature
is using the following form on our website:
http://www.adobe.com/cfusion/mmform/index.cfm?name=wishform
I will report this to the product team through my channels. You may want to submit this issue through the web form as it goes directly to the product development team.
I hope this information helps to resolve your issue. If you require
further assistance with this issue, please update your web case with
complete details, including what steps you have applied and any error
messages you are receiving.
You may also call Technical Support at (800) 642-3623. We are available from 6:00 am to 5:00 pm Monday - Friday, Pacific Time.
Kind regards,
Alan C.
Adobe Web Support
Maybe you are looking for
-
Can't install Vista through Parallel
When I tried to install Vista through parallel I recieved the following error: "This computer is not compliant with the Advanced Configuration and Power Interface (ACPI) standard. Windows must be installed onto a computer that supports ACPI. Contact
-
IMovie 09 crashes every time i export. Have posted crash log.
Every time i export my iMovie project it always crashes. Seems to be a problem with Thread 1 which I have no idea what that is. I tried exporting into DV, MOV and MP4 but anything i do seems to make no difference. Here is crash log: Process: iMovie [
-
¿Why Print out message in Migo get duplicateg when event 4 in MN22 is selected?
Hello, I am not able to find out why the print out message get duplicate when I change event 3 to event 4 in MN22. when I do Good issues in MIGO and the message "ZVAL" is set in event 3 "Send with application own transaction" only one type of message
-
Project My Screen keeps Searching...
Trying to make Project My Screen (PMS) working. Lumia 920 with Windows Phone 8.1 PMS application installed on Windows 7 laptop. USB cable connected. When starting PMS on the phone it keeps Searching...., PMS on laptop remains black. I already did mos
-
Hi Experts, In which table or infotype i can find Emp Work Location & Emp Supervisor Id? Please suggest. I could not find any straight tables for these fields. Thanks.