Select table name dynamically
I want to create a cursor in which the select statement should be
dynamic:<o:p></o:p>
if @PhoneType = White<o:p></o:p>
Then the select statement should
be as<o:p></o:p>
select
distinct
MODEL_NUM from
Dbo.Apple<o:p></o:p>
if @PhoneType = Black<o:p></o:p>
select
distinct
MODEL_NUM from
Dbo.Samsung<o:p></o:p>
IF @MobileId
IS NOT NULL
BEGIN
IF @PhoneType =
'white'
SET @SqlStmt
= 'select distinct MODEL_NUM from dbo.Apple'
IF @PhoneType =
'Black'
SET @SqlStmt
= 'select distinct MODEL_NUM from dbo.Samsung'
declare MOBILE
cursor for
select distinct
MODEL_NUM from Dbo.Apple
After a few decades with SQL, my rule of thumb is that you should write no more than five cursors in an entire career. Furthermore, dynamic SQL is how you tell the world you failed at your DDL and architecture, so you have to depend on future random users
to do your job.
I also see you use if-then-else flow controls in SQL! This is a declarative language. We hate that kind of programming.
Since you felt exempt from Netiquette and did post DDL, I will guess that the phones are set of entities which have a manufacturer. Putting them in separate tables is a design flaw called “attribute splitting” , much like having “Male_Personnel” and “Female_Personnel”
instead of a Personnel table with a sex_code column.
The skeleton for this kind of problem puts all the validation in a single table, thus:
CREATE TABLE Phones
model_nbr VARCHAR (???) NOT NULL,
manufacturer_name VARCHAR (???) NOT NULL,
CONSTRAINT Valid_Model_nbr
CHECK (CASE manufacturer_name
WHEN 'Apple' AND model_nbr LIKE '<reg exp>
THEN 'T'
WHEN 'Samsung' AND model_nbr LIKE '<reg exp>
THEN 'T'
ELSE 'F' END = 'T'),
--CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
in Sets / Trees and Hierarchies in SQL
Similar Messages
-
How to pass the table name dynamically in xml parsing
Hi All,
I have created one procedure for parsing xml file which is working perfectly.
FORALL i IN t_tab.first .. t_tab.last
INSERT INTO Test_AP VALUES t_tab(i);Now I want to put the table name dynamically+. For that I have added one query and modify above code as follow:-
I have already declare dml_str varchar2(800) in declaration part.
Query is as follows:-
select table_name into tab_name from VERSION_DETAILS where SUBVERSION_NO=abc; -- here abc is variable name which contains values.
FORALL i IN t_tab.first .. t_tab.last
dml_str := 'INSERT INTO ' || tab_name || ' values :vals';
EXECUTE IMMEDIATE dml_str USING t_tab(i);But it's not working. How I will resolve this or through which way I achieved the intended results. Anyone can guide me on this matter.
Thanks in advance for your help...Hi,
But it's not working.Don't you think it would help to give the error message?
Put the assignment before FORALL.
FORALL only accepts one subsequent DML statement (static or dynamic SQL) :
dml_str := 'INSERT INTO ' || tab_name || ' values :vals';
FORALL i IN t_tab.first .. t_tab.last
EXECUTE IMMEDIATE dml_str USING t_tab(i); -
Problem in using table name dynamically in PL/SQL
I tried to create a procedure to use table name dynamically and got the following error. Anything wrong with my procedure?
NFADV>declare
2 cnt number;
3 cursor cur is select table_name from user_tables where table_name in ('EMP','DEPT');
4 begin
5 for c1 in cur
6 loop
7 execute immediate select count(*) into cnt from c1.table_name;
8 dbms_output.put_line('Count is : '||cnt);
9 end loop;
10 end;
11 /
declare
ERROR at line 1:
ORA-06550: line 7, column 21:
PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
( - + case mod new not null <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current exists max min prior sql stddev sum variance
execute forall merge time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe
<an alternatively-quoted string literal with character set specification>
<an alternatively-quo
ORA-06550: line 8, column 5:
PLS-00103: Encountered the symbol "DBMS_OUTPUT"
ORA-06550: line 8, column 45:
PLS-00103: Encountered the symbol ";" when expecting one of the following:
. ( , * % & - + / at mod remainder rem <an identifier>
<a double-quoted delimited-identifier> <an exponent (**)> as
from into || multiset bulkThanks and Regards
KaustubhHi,
The wrong part is in execute immediate, it should be as follows:
execute immediate ('select count(*) from '|| c1.table_name)
into cnt
(not tested)
Regards
AK -
How to use table name dynamically in report procedure
Hello every body
I want to use table name dynamically means at runtime i want to pass table name.
I can do this by lexical parameter in main query.
But my problem is that i want to crate new format trigger or new function that use 1 cursor in which that lexical parameter : table name is used.
so how to do that?
i can not use that lexical parameter it is giving error.
please help me how to do that.Call a database function which you pass the lexical parameter. Then in the database function you use dynamic sql or the execute immediate option to build the SQL string.
Return the information from this function to build your business logic on in your format trigger.
Marcos -
How to populate table name dynamically to a ref cursor
Hi,
I came accross with a requirement that in ref cursor how can i pass the table name
for ex
open ref_cur for select * from emp;Like that i've some 100 tables , instead of typing each and every time the table name
that should be dynamically changed
Like below
open ref_cur for select * from &tbl_nm;How can i do that??
Thank youI assume you are using SQL*Plus:
SQL> variable ref_cur refcursor;
SQL> begin
2 open :ref_cur for select * from &tbl_nm;
3 end;
4 /
Enter value for tbl_nm: emp
old 2: open :ref_cur for select * from &tbl_nm;
new 2: open :ref_cur for select * from emp;
PL/SQL procedure successfully completed.
SQL> print ref_cur
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7369 SMITH CLERK 7902 12/17/1980 00:00:00 800 20
7499 ALLEN SALESMAN 7698 02/20/1981 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 02/22/1981 00:00:00 1250 500 30
7566 JONES MANAGER 7839 04/02/1981 00:00:00 2975 20
7654 MARTIN SALESMAN 7698 09/28/1981 00:00:00 1250 1400 30
7698 BLAKE MANAGER 7839 05/01/1981 00:00:00 2850 30
7782 CLARK MANAGER 7839 06/09/1981 00:00:00 2450 10
7788 SCOTT ANALYST 7566 04/19/1987 00:00:00 3000 20
7839 KING PRESIDENT 11/17/1981 00:00:00 5000 10
7844 TURNER SALESMAN 7698 09/08/1981 00:00:00 1500 0 30
7876 ADAMS CLERK 7788 05/23/1987 00:00:00 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7900 JAMES CLERK 7698 12/03/1981 00:00:00 950 30
7902 FORD ANALYST 7566 12/03/1981 00:00:00 3000 20
7934 MILLER CLERK 7782 01/23/1982 00:00:00 1300 10
14 rows selected.
SQL> begin
2 open :ref_cur for select * from &tbl_nm;
3 end;
4 /
Enter value for tbl_nm: dept
old 2: open :ref_cur for select * from &tbl_nm;
new 2: open :ref_cur for select * from dept;
PL/SQL procedure successfully completed.
SQL> print ref_cur
DEPTNO DNAME LOC
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> SY. -
Can we pass IT table name dynamically to READ and SORT stmt
Hello All,
i have a requirement in which i am passing table name using a variable and want to read the same table: so my question is can we execute read and sort stmt with dynamic IT name. please see below for explaination.
v_itname = <it_2>.
now read using variable
READ table ( v_itname ) with key <field>.
and
SORT ( v_itname ) by (otab).
thanks
ManiHi ,
This can be done. Please refer to the codes below. Please note that the code will work if the itabs are of type standard table else it may dump.
You just need to replace the variables form the values from your internal table.
DATA: v_table1(10) TYPE c VALUE 'I_MARA',
v_field(10) TYPE c VALUE 'MATNR',
i_mara TYPE STANDARD TABLE OF mara.
FIELD-SYMBOLS : <fs_tab> TYPE STANDARD TABLE,
<fs_field> TYPE ANY.
DATA: otab TYPE abap_sortorder_tab,
oline TYPE abap_sortorder.
SELECT * UP TO 10 ROWS
FROM mara
INTO TABLE i_mara.
IF sy-subrc = 0.
ASSIGN (v_table1) TO <fs_tab>.
IF sy-subrc = 0.
oline-name = v_field.
APPEND oline TO otab.
SORT <fs_tab> BY (otab).
READ TABLE <fs_tab>
WITH KEY (v_field) = '000000000020000989' "
BINARY SEARCH
TRANSPORTING NO FIELDS.
IF sy-subrc = 0.
ENDIF.
ENDIF.
ENDIF.
Regards,
Dev. -
Crystal 2008 - Selected table names are blank or end in 1
I am creating a new report in Crystal 2008. I am connecting to a database using ODBC. The tables show up correctly in the available tables column of the Database Expert. Once I select a table the table shows up in the selected tables list as an icon only - no name or as an icon with a table name ending in 1. The table name that ends in 1 is not a duplicate.
Furthermore, in the field explorer the fields all show but I can not add any to the report.
Any ideas, this just started happening this week.Hi Russell
Which database you are reporting off?
You can try following workaround and create indirect ODBC connection.
Create a report using OLEDB connection and select Microsoft OLE DB Provider for ODBC drivers and then create a report .
This will point to your existing ODBC connection through OLEDB provider.
For the tables name that are blank do you have hyphen '-' in their names?
As advised by Jayendra you can try with Service Pack 1for Crysatl Reports 2008.
Hope this helps..
Regards
Ankeet -
Select table columns dynamically at runtime
Hi All,
I've the requirement where user wants to see report columns based on certain parameters.
Report contains revenue data for range of periods for a transaction, and each period is a column in table (period starting from 01-JAN-2010 to 31-DEC-2020). All the transactions may not start and end at a same period. Now report need to be display only certain columns (periods) based on period range parameter.
Ex: if trx_123 started in 01-JAN-2011 and ended in 31-MAR-2011 and trx_234 started in 01-FEB-2011 and ended in 31-JUL-2011. now the report output should display in following format.
Trx Number period_01-JAN-2011 period_01-FEB-2011 period_01-MAR-2011 period_01-APR-2011 period_01-MAY-2011 period_01-JUN-2011 period_01-JUL-2011
trx_123 100 120 180
trx_234 50 100 80 20It should not display all the periods (columns) in table.
Any suggestion on how to develop this report with dynamic columns (any reporting tool)?
Thanks in advance!!Hi,
You can do this type of report in Discoverer using a crosstab report. Having period data in separate columns makes this difficult and generally this is not good database design.
You can get around the problem using a row generator. If you join the data to a row generator so that you have a single column containing the period data and a row for each item of period data then you can use the crosstab report to show only the periods that contain data.
See this [url http://learndiscoverer.blogspot.com/2008/10/row-generators.html]link for more information on row generators.
Rod West -
Dynamically assigning table name in select statement
how can i assign the table name dynamically in Select statement?
i tried following code
create or replace procedure proc1
as
x varchar2(100);
y varchar2(10);
begin
x='UNIT_MASTER';
execute immediate 'select unit_code into y from x where
rownum=1';
dbms_output.put_line(y);
end;
the procedure is created but when i execute the procedure the
error is shown in the execute immediate statementDo the following :
Create or replace procedure pro1 as
x varchar2(100);
y varchar2(10);
begin
x := 'UNIT_MASTER';
EXECUTE IMMEDIATE 'select unit_code from '||x||' where rownum
= 1' INTO y;
dbms_output.put_line(y); -
Using Table name in Read statement dynamically
Hi Experts,
I have the following requirement.
Based on a country code say "A" , "B", "C" and based on this i have to read different internal tables lt_tabA, lt_tabB and lt_tabC.
The table key can be given dynamically, but how can i use the internal table name dynamically without using if statements.
Please help.
Thanks!
Best Regards,
GayathriHi Gayathri,
something like
DATA:
lt_t100 TYPE TABLE OF t100,
lt_t000 TYPE TABLE OF t000.
FIELD-SYMBOLS:
<table> TYPE table,
<rec> TYPE ANY,
<field> TYPE ANY.
SELECT:
* INTO CORRESPONDING FIELDS OF TABLE lt_t100 FROM t100 UP TO 10 ROWS,
* INTO CORRESPONDING FIELDS OF TABLE lt_t000 FROM t000 UP TO 10 ROWS.
CASE abap_true.
WHEN space.
ASSIGN lt_t100 TO <table>.
WHEN OTHERS.
ASSIGN lt_t000 TO <table>.
ENDCASE.
READ TABLE <table> with key ('MANDT') = sy-mandt ASSIGNING <rec>.
Regards,
Clemens -
Is it possible to make a search help with dynamic selection table?
Hi Experts,
Is it possible to create search helps with dynamic seletion tables means
i dont know the selection table names at the time of creation of search help.
These tables will be determined at runtime.
if yes, Please give an idea how to create and pass the table names at runtime.
Thanks
Yogesh GuptaHi Yogesh,
Create and fill your itab and show it with FM F4IF_INT_TABLE_VALUE_REQUEST
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'field to return from itab'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'field on your screen to be filled'
stepl = sy-stepl
window_title = 'some text'
value_org = 'S'
TABLES
value_tab = itab
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
Darley -
Create table with dynamic table name.
I'm trying to create a table
like
select x.*, convert(nvarchar(20), getdate(), 101) AS LoadDate
into table1_20140512
from (
select c1,c2,c3 from table2_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM table2_20140512 )
union all
select c1,c2,c3 from table3_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM table3_20140512 )
) X
I want to make table name dynamic, like 'table1'+toady's date
I declared three variables, but they didn't work as I expected
These are my variables
DECLARE @table1 nvarchar(500)
DECLARE @table2 nvarchar(500)
DECLARE @table3 nvarchar(500)
SET @table1='H1_' +(CONVERT(VARCHAR(8),GETDATE(),112))
SET @table2='H2_' +(CONVERT(VARCHAR(8),GETDATE(),112))
SET @table2='H3_' +(CONVERT(VARCHAR(8),GETDATE(),112))Try the following:
DECLARE @SQL nvarchar(2000);
DECLARE @table1 nvarchar(500) ='H1_' +(CONVERT(VARCHAR(8),GETDATE(),112));
DECLARE @table2 nvarchar(500) ='H2_' +(CONVERT(VARCHAR(8),GETDATE(),112));
DECLARE @table3 nvarchar(500) ='H3_' +(CONVERT(VARCHAR(8),GETDATE(),112));
PRINT @table1+' '+@table2+' '+@table3;
--H1_20140512 H2_20140512 H3_20140512
SET @SQL = 'select x.*, convert(nvarchar(20), getdate(), 101) AS LoadDate
into '+QUOTENAME(@table1)+'
from (
select c1,c2,c3 from table2_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM '+QUOTENAME(@table2)+' ))
union all
select c1,c2,c3 from table3_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM '+QUOTENAME(@table3)+' ))
) X '
PRINT @SQL; -- debugging
/* select x.*, convert(nvarchar(20), getdate(), 101) AS LoadDate
into [H1_20140512]
from (
select c1,c2,c3 from table2_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM [H2_20140512] ))
union all
select c1,c2,c3 from table3_20140512
WHERE(LoadDate = (select MAX(LoadDate) FROM [H3_20140512] ))
) X
EXEC sp_executeSQL @SQL;
Dynamic SQL examples:
http://www.sqlusa.com/bestpractices/dynamicsql/
Kalman Toth Database & OLAP Architect
SQL Server 2014 Design & Programming
New Book / Kindle: Exam 70-461 Bootcamp: Querying Microsoft SQL Server 2012 -
How user variable table names in select statement
Dear all,
I have three table gp1,gp2,g3. i want user variable table in sql query
for example at oracle forms have a list table showing table names gp1,gp2,gp3
at form i want user this query
select gpno from :table where gpno=120;
how i can specify table name Dynamicly in select query
ThanksForms_DDL is a one-way street: You can only pass DDL commands TO the database; you cannot get data back using Forms_DDL.
Exec_SQL is the Forms package that enables dynamic sql within a form. But to retrieve data, you have to make a Exec_SQL call for every column in every row. So it is not a good thing to use, either.
The ref cursor method should work. You could also retrieve the data into a record group using populate_group_with_query -- it also enables dynamic data retrieval.
But if you already know you have three distinct tables and you know their names, I would keep it simple and just write three sql select statements. -
How to pass dynamically table name in my cursor declaration
Hi:
I am new. could you please let me know how to pass a table name dynamically in my cursor declaration? for instance I am declaring the following cursor in my pl/sql procedure:
CURSOR crs_validate IS
select * FROM <ACT_JUN_2006_LOB>;
this ACT_JUN_2006_LOB table name, I should able to pass it when I open the cursor ... any help appreciated. thanks.
sriniThanks all for the response. REFCURSOR does work: here is an example ... which I found on-line
procedure emp_test(
month varchar2,
year varchar2)
is
type cur_typ is ref cursor;
c cur_typ;
query_str varchar2(200);
emp_number number := 7900;
salary number;
name varchar2(30);
Begin
query_str := 'Select empno, ename, sal from emp_' || month ||'_'||year
|| ' where empno = :id';
open c for query_str using emp_number;
loop
fetch c into emp_number, name, salary;
exit when c%notfound;
dbms_output.put_line(emp_number);
end loop;
close c;
end; -
Dynamically pick the table names in data flow task SSIS
Hi All,
I want to create a SSIS package which loads the data to a table on the other server every day. I have around 250 tables to load everyday and source and destination table names are available in a metadata table, table names have to read from the metadata
table and data should be loaded. Is there a way that we can configure the source and destination table names dynamically in Data flow task?
I am newbie to SSIS can any help with the solution for this problem.You can do that, not a big deal. The underlying problem is say suppose you constructed a ETL based on some x source and y destination and have put x(3 columns) as source and y destination(3 columns).. As you said if we have choice of dynamically pick the
table names.. ETL might fail when you face below situation
source x(3 columns) destination y (4 columns) and there will be no mapping as it is dynamic. Sometimes mapping also fails even if the source and destination have same number of columns. If you still want to do... follow below steps:
Create two variables:
1.variable1 , datatype string
2.variable datatype string
take one execute sql task, pick your source table names dynamically as you desired from metadata table \
"SELECT sourcetblname as Res FROM @metadata WHERE ID=1" in sql statement and then go to name the result name as Res (I meant same as table alias) and map it to variablename1
And in variable2 go to expression and write "Select * from "+@[User::variable].. and this will be your constructed dynamic command for oledb destination.
And connect that execute sql task to (Data flow task)oledb source and choose data access mode as sql command with variable,and choose variable2. below is the diagram.
- please mark correct answers
Maybe you are looking for
-
Hi Experts, Please understand my issue/requirement that, I have to make the item conditions tab in display or deactivate mode to prevent users to change or create the price or conditions while posting VF01. As std, system allows users to create or ch
-
HELP! I've created a blue movie!
Just created my first movie using Premier Pro CS5. Just a standard QuickTime DV Pal. As I've done with CS4, I went to File - Export - Media. I set it to QuickTime PAL DV then clicked Export. To my surprise it started rendering without first opening A
-
Oracle 10g- Problem in DB Console
Hi All, I’m new to the Oracle Domain. My oracle db version is of 10.2.0.1.0, whereas I couldn’t able to open the OEM DB console. Below are the steps that i tried, but I didn’t found the solution: C:\>emca -ddbcontrol db -repos dropeconfig STARTED EMC
-
Hi, I've a small problem ... I've 2 tables one holding document information like docnumber, title, creater etc and a second table holding the keywords of the document (cols: docnumber, keyid, keyvalue). I need the value of 10 keywords of a document i
-
Browser compatibility error question by new user
I''m a new user of CS4, first full website, and am receiving an error that apparently will effect almost every browser (figures!) The error message reads: "Found 1 errors in twoColFixLtHdr.css." The error message refers to line 8. My site is under co