Using variable as table name in pl/sql query - Is possible?
I am relatively new to PL/SQL and I am trying to create a function that accepts a table name and a rowid as arguments and returns a comma-delimited record string of the values of the table/rowid being passed. The problem is , I cannot code a select stmt as follows
SELECT * FROM v_table_name
WHERE rowid = v_row_id
in PL/SQL. There must be a easy way to approach this.
Thanks for any and all advice.
GC
I don't understand the use of the concat symbol along with the commas and field namesYou just need (if you really need it) to create variable which contains you column separated by comma:
Simple example (in the second case separate variables are used to create
the list of columns):
SQL> declare
2 rc sys_refcursor;
3 cols varchar2(200) := 'ename, empno, sal';
4 tab varchar2(30) := 'emp';
5 begin
6 open rc for 'select ' || cols || ' from ' || tab;
7 close rc;
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> declare
2 rc sys_refcursor;
3
4 ename_col varchar2(10) := 'ename';
5
6 empno_col varchar2(10) := 'empno';
7
8 sal_col varchar2(10) := 'sal';
9
10 tab varchar2(30) := 'emp';
11
12 begin
13
14 open rc for 'select ' || ename_col || ',' || empno_col || ',' || sal_col ||
15 ' from ' || tab;
16
17 close rc;
18 end;
19 /
PL/SQL procedure successfully completed.Rgds.
Similar Messages
-
Using variables as table names. Ideas for alternative designs
Hi,
I am designing an application which uses synonyms to pull information from 'client' DBs via DB Links. The synonyms are created with a DB_ID in the name (example: CUSTOMER_100, CUSTOMER_200... where 100 and 200 are DB IDs from 2 separate client DBs.
I have a procedure which selects data from the synonym based on what DB_ID is passed to the procedure. I want to be able to run this one procedure for any DB_ID that is entered. I am now aware I cannot use variable names for table names and using EXECUTE IMMEDIATE doesnt seem to fit for what I am trying to do.
Does anybody have any suggestions or re-design options I could use to achieve this generic procedure that will select from a certain synonym based on the DB info input parameters? Thanks.
CREATE OR REPLACE PROCEDURE CUSTOMER_TEST(p_host IN VARCHAR2, p_db_name IN VARCHAR2, p_schema IN VARCHAR)
IS
v_hostname VARCHAR2 (50) := UPPER (p_host);
v_instance VARCHAR2 (50) := UPPER (p_db_name);
v_schema VARCHAR2 (50) := UPPER (p_schema);
v_db_id NUMBER;
v_synonym VARCHAR2(50);
CURSOR insert_customer
IS
SELECT
c.customer_fname,
c.customer_lname
FROM v_synonym_name c;
BEGIN
-- GET DB_ID BASED ON INPUT PARAMETERS
select d.db_id
into v_db_id
from t_mv_db_accounts ac,
t_mv_db_instances i,
t_mv_dbs d,
t_mv_hosts h
where ac.db_ID = d.db_ID
and i.db_ID = d.db_ID
and i.HOST_ID = h.host_id
and upper(H.HOST_NAME) = v_hostname
and upper(D.DB_NAME) = v_instance
and upper(Ac.ACCOUNT_NAME) = v_schema;
--APPEND DB_ID TO THE SYNOYNM NAME
v_synonym := 'CUSTOMER_'||v_db_id;
FOR cust_rec IN insert_customer
LOOP
INSERT INTO CUSTOMER_RESULTS (First_Name, Last_Name)
VALUES (cust_rec.customer_fname, cust_rec.customer_lname);
END LOOP;
COMMIT;
END;
Rgs,
RobHi
rules engine style with table that holds the logic or code SQL directly in the procedure and IF THEN ELSE with db_id. Latter is better because SQL is native and objects are checked every time procedure is compiled.
James showed the simplest way but this rather complex way gives you more flexibility between instances if ever needed.
CREATE TABLE synonym_dml(db_id number not null primary key, sql_text clob)
INSERT INTO synonym_dml VALUES (100, 'INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer100')
INSERT INTO synonym_dml VALUES (200, 'INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer200')
set serveroutput on size unlimited
create or replace
PROCEDURE Execute_Synonym_Dml(p_host VARCHAR2, p_db_name VARCHAR2, p_schema VARCHAR) IS
BEGIN
FOR r IN (
SELECT sql_text FROM synonym_dml
-- WHERE db_id IN (
-- SELECT d.db_id
-- FROM t_mv_db_accounts ac, t_mv_db_instances i, t_mv_dbs d, t_mv_hosts h
-- WHERE ac.db_id = d.db_id
-- AND i.db_id = d.db_id
-- AND i.host_id = h.host_id
-- AND upper(h.host_name) = p_hostname
-- AND upper(d.db_name) = p_instance
-- AND upper(ac.account_name) = p_schema
LOOP
DBMS_OUTPUT.PUT_LINE('-- executing immediately ' || r.sql_text);
--EXECUTE IMMEDIATE r.sql_text;
END LOOP;
END;
create or replace
PROCEDURE Execute_Synonym_Dml_Too(p_host VARCHAR2, p_db_name VARCHAR2, p_schema VARCHAR) IS
PROCEDURE DB_ID_100 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('-- executing DB_ID_100');
--INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer100;
END;
PROCEDURE DB_ID_200 IS
BEGIN
DBMS_OUTPUT.PUT_LINE('-- executing DB_ID_200');
--INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer200;
END;
BEGIN
FOR r IN (
SELECT 100 db_id FROM dual
-- SELECT d.db_id
-- FROM t_mv_db_accounts ac, t_mv_db_instances i, t_mv_dbs d, t_mv_hosts h
-- WHERE ac.db_id = d.db_id
-- AND i.db_id = d.db_id
-- AND i.host_id = h.host_id
-- AND upper(h.host_name) = p_hostname
-- AND upper(d.db_name) = p_instance
-- AND upper(ac.account_name) = p_schema
LOOP
IF (r.db_id = 100) THEN
DB_ID_100;
ELSIF (r.db_id = 200) THEN
DB_ID_200;
ELSE
RAISE_APPLICATION_ERROR(-20001, 'Unknown DB_ID ' || r.db_id);
END IF;
END LOOP;
END;
EXECUTE Execute_Synonym_Dml('demo','demo','demo');
EXECUTE Execute_Synonym_Dml_Too('demo','demo','demo');
DROP TABLE synonym_dml PURGE
DROP PROCEDURE Execute_Synonym_Dml
table SYNONYM_DML created.
1 rows inserted.
1 rows inserted.
PROCEDURE EXECUTE_SYNONYM_DML compiled
PROCEDURE EXECUTE_SYNONYM_DML_TOO compiled
anonymous block completed
-- executing immediately INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer100
-- executing immediately INSERT INTO customer_results (first_name, last_name) SELECT customer_fname,customer_lname FROM customer200
anonymous block completed
-- executing DB_ID_100
table SYNONYM_DML dropped.
procedure EXECUTE_SYNONYM_DML dropped. -
Parse SQL: How to extract column names, table names from a SQL query
Hi all,
I have a requirement wherein a SQL query will be given in a text file.
The text file has to be read (probably using text_io package), the SQL query needs to be parsed and the column names, table names and where clauses have to be extracted and inserted into separate tables.
Is there a way to do it using PL/SQL ?
Is there a PL/SQL script available to parse and extract column names, table names etc ?
Pls help.
Regards,
SamI think I jumped to conclusion too early saying it is completely possible and straight forward. But after reading through your post for one more time I realised you are not interested only in the column_names, also the table_names and the predicates .
>
SQL query needs to be parsed and the column names
>
The above is possible and straight forward using the dbms_sql package.
I am pasting the same information as I did in the other forum.
Check this link and search for Example 8 and .
http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_sql.htm#sthref6136
Also check the working example from asktom
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1035431863958
>
table names and where clauses have to be extracted
>
Now this is the tricky bit. You can extract the list of tables by getting the sql_id from v$sql and joining it with v$sql_plan. But sometimes you may not get all the results because the optimizer may choose to refine your query (check this link)
http://optimizermagic.blogspot.com/2008/06/why-are-some-of-tables-in-my-query.html
and you can get the predicate information from the same table v$sql_plan but I will leave that area for you to do some R&D.
Regards
Raj
Edited by: R.Subramanian on Dec 10, 2008 3:14 AM -
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 -
SQL or PL/SQL : dynamically insert table name in a SQL Statement
Hi,
We have a strange requirement - we need to dynamically use the table names in a SQL Query. E.g:
select * from :table_name
The table_name will be chosen from a list. I have tried this in SQL as well as PL SQL - but, I have been unsuccessul so far.
Can you guys please help me solve this puzzle ?
I hope I have explained my quesion clearly - if not, please do let me know if some more details are necessary.
Regards,
RamkyThe following is the anonymous block that im using in a report in HTMLDB. My problem is Line Number 9. The bind variable contains the chosen table name at
the run time.
Variable "qry_stmt" contains the query to be returned, so that result set for that query will be displayed in the report.
If I hard code the table name(rather that passing it through bind variable) in the
qry_stmt string, Im getting the result sets for that query. But if I pass through
bind variable at run time, its still generating the string correctly( im printing
using a print statement at line number 14). But its returing the following report
error
report error:
ORA-01403: no data found
Please advice/help me in this.....
declare
qry_stmt varchar2(1000);
p_table varchar2(30) := 'EMP';
P_ENAME varchar2(1000);
begin
IF :p2_TABLE_NAMES IS NOT NULL THEN
qry_stmt := 'select * from '||TRIM(:P2_TABLE_NAMES); -- Line Num 9
execute immediate qry_stmt; --into P_ENAME;
ELSE
qry_stmt := 'SELECT 1 FROM dual ';
END IF;
htp.p(qry_stmt);--Line Num 14
return qry_stmt;
EXCEPTION WHEN NO_DATA_FOUND THEN
NULL;
end;
Thanks and Regards,
Ramky -
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. -
Can we use formula column in lexical parameter in sql query ...
hi
can we use formula column in lexical parameter in sql query ...
as example
i want to give
select * from & c_table
forumula
function c_table
if :p_sort = 1 then
return 'dept'
else
return 'emp'
end;
c_table formula column
is this possible ...
i have such example in oracle apps reports
if i try in ordinary report usinf emp table it show error ..
how we can give formula column...
please help me in this regard...
Edited by: 797525 on Feb 20, 2012 9:31 PMthanks sir,
iam not exactly saying select * from &c_table but some thing that like columns in select stmt also will be populated in user_parameters ,there are lot of table select.......from mtl_demand md, mtl_system_items msi, mtl_txn_source_types mtst, mtl_item_locations loc &C_source_from &C_from_cat
&c_source_from and &c_from_cat formula column and there are defined at report level only ......
pl/sql code &c_source_from is
function C_source_fromFormula return VARCHAR2 is
begin
if :P_source_type_id = 2 then return(',MTL_SALES_ORDERS mkts');
else if :P_source_type_id = 3 then return(',GL_CODE_COMBINATIONS gl');
else if :P_source_type_id = 6 then return(',MTL_GENERIC_DISPOSITIONS mdsp');
else if :P_source_type_id = 5 then
if :C_source_where is null then
return NULL;
else
return(',WIP_ENTITIES wip');
end if;
else if :P_source_type_id = 8 then return(',MTL_SALES_ORDERS mkts');
else if :P_source_type_id is null then
return(',MTL_SALES_ORDERS mkts,
MTL_GENERIC_DISPOSITIONS mdsp,
GL_CODE_COMBINATIONS gl ');
else null;
end if; end if; end if; end if; end if; end if;
RETURN NULL; end;
this is forumula column i hope that you understand what iam saying
please help me in this regard....
thanking you... -
Update two different tables by a single sql query:
Hi All,
i need to update two different talbes in a single sql query..
i m using the following query
UPDATE FT_User_Alert SET Subscription = 'W' where product_key=1 and measure_key = 12
AND
UPDATE LU_Monthly_Alert_Budget_Sheet SET Min_Red_Range ='16.0' AND Max_Green_Range ='24.0'AND Max_Red_Range ='27.0'AND Min_Green_Range ='16.0' where product_key='1' and measure_key = 12
i m getting the following error:
Odbc driver returned an error (SQLExecDirectW).
Error Details
Error Codes: OPR4ONWY:U9IM8TAC:OI2DL65P
State: HY000. Code: 10058. [NQODBC] [SQL_STATE: HY000] [nQSError: 10058] A general error has occurred. [nQSError: 43093] An error occurred while processing the EXECUTE PHYSICAL statement. [nQSError: 17001] Oracle Error code: 936, message: ORA-00936: missing expression at OCI call OCIStmtExecute: UPDATE FT_User_Alert SET Subscription = 'W' where product_key=1 and measure_key = 12 AND UPDATE LU_Monthly_Alert_Budget_Sheet SET Min_Red_Range ='16.0' AND Max_Green_Range ='24.0'AND Max_Red_Range ='27.0'AND Min_Green_Range ='16.0' where product_key='1' and measure_key = 12 . [nQSError: 17011] SQL statement execution failed. (HY000)
SQL Issued: EXECUTE PHYSICAL CONNECTION POOL writeback UPDATE FT_User_Alert SET Subscription = 'W' where product_key=1 and measure_key = 12 AND UPDATE LU_Monthly_Alert_Budget_Sheet SET Min_Red_Range ='16.0' AND Max_Green_Range ='24.0'AND Max_Red_Range ='27.0'AND Min_Green_Range ='16.0' where product_key='1' and measure_key = 12
but when i m ushin the same query in Microsoft SQL Server it executes properly:
please help me out...Duplicate thread. I've already answered on your other thread...
update two different tables by a single sql query: -
How to use a variable as a table name in PL/SQL?
Hello all.
I was given one day to wrote a piece of PL/SQL code to do a query. That is,
First select two columns from one table and use them to build another table's name, then
join the two tables. I'm not sure if variables can be used in the select list, if possible,
how to reference them?
-- My code is
DECLARE
tablename varchar2(40);
CURSOR c1 IS
select a.sourcesystemcode, a.adminorganizationno from cdb1.organization_mapping a
where exists( select 1 from cdb1.organization_mapping b where
a.cdborganizationno = b.cdborganizationno and a.adminorganizationno != b.adminorganizationno)
order by a.cdborganizationno,a.adminorganizationno;
v_src_sys_cod cdb1.organization_mapping.sourcesystemcode%TYPE;
v_adm_org_no cdb1.organization_mapping.adminorganizationno%TYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v_src_sys_cod, v_adm_org_no;
EXIT WHEN c1%NOTFOUND;
tablename := 'ODS1.SRC_' || v_src_sys_cod || v_adm_org_no || 'ACTORG_CURR';
select c.cdborganizationno, c.sourcesystemcode, c.adminorganizationno, c.sourceorganizationno, d.ibkcde, d.orgnam
from cdb1.organization_mapping c inner join tablename d on c.sourceorganizationno = d.orgidt;
END LOOP;
CLOSE c1;
END;
The error message says "... the table or view does not exist... line 18, column 66..."
It says the variable "tablename" wasn't build or build incorrectly.
Please give the solution.If the TABLEs being queried are already known, and it is just a matter of which one to query, perhaps you can CREATE a VIEW that uses all the TABLEs with a UNION ALL, and include an identifier COLUMN.
CREATE VIEW SRC_ALL_ACTORG_CURR
AS
SELECT 'aa' Name, ibkcde, orgnam FROM SRC_aa_ACTORG_CURR UNION ALL
SELECT 'bb' Name, ibkcde, orgnam FROM SRC_bb_ACTORG_CURR UNION ALL
SELECT 'cc' Name, ibkcde, orgnam FROM SRC_cc_ACTORG_CURR UNION ALL
SELECT 'dd' Name, ibkcde, orgnam FROM SRC_dd_ACTORG_CURR UNION ALL
SELECT 'ee' Name, ibkcde, orgnam FROM SRC_ee_ACTORG_CURR;
Then, in you query:
select c.cdborganizationno, c.sourcesystemcode, c.adminorganizationno, c.sourceorganizationno, d.ibkcde, d.orgnam
from cdb1.organization_mapping c inner join SRC_ALL_ACTORG_CURR d on c.sourceorganizationno = d.orgidt and d.Name = v_src_sys_cod || v_adm_org_no; -
Use a variable as a table name with NATIVE SQL
Hi all,
I am trying to execute a SELECT statement in order to fetch data from an external Oracle DB table to SAP with the following instructions:
EXEC SQL.
SELECT cityfrom, cityto
INTO STRUCTURE :wa
FROM spfli
WHERE mandt = :sy-mandt AND
carrid = :p_carrid AND connid = :p_connid
ENDEXEC.
However, I need to indicate the external table name from a variable instead of the solution above. That is, declaring a variable and store the name of the table (e.q. spfli) in it. The resulting ABAP code would be something like:
EXEC SQL.
SELECT cityfrom, cityto
INTO STRUCTURE :wa
FROM <VARIABLE>
WHERE mandt = :sy-mandt AND
carrid = :p_carrid AND connid = :p_connid
ENDEXEC.
Does anybody know if is possible to do that?
If not, is there any other solution?
Thank you in advanceYes, as Suhas said, you could use the ADBC API and his class CL_SQL_CONNECTION to achieve this...
Here is a small example:
PARAMETERS: p_carrid TYPE spfli-carrid,
p_connid TYPE spfli-connid.
DATA:
l_con_ref TYPE REF TO cl_sql_connection,
l_stmt TYPE string,
l_stmt_ref TYPE REF TO cl_sql_statement,
l_dref TYPE REF TO data,
l_res_ref TYPE REF TO cl_sql_result_set,
l_col1 TYPE spfli-carrid,
l_col2 TYPE spfli-connid,
l_wa TYPE spfli.
CONSTANTS:
c_tabname TYPE string VALUE 'SPFLI'.
* Create the connecction object
CREATE OBJECT l_con_ref.
* Create the SQL statement object
CONCATENATE 'select * from' c_tabname 'where carrid = ? and connid = ?'
INTO l_stmt SEPARATED BY space. "#EC NOTEXT
l_stmt_ref = l_con_ref->create_statement( ).
* Bind input variables
GET REFERENCE OF l_col1 INTO l_dref.
l_stmt_ref->set_param( l_dref ).
GET REFERENCE OF l_col2 INTO l_dref.
l_stmt_ref->set_param( l_dref ).
* Set the input value and execute the query
l_col1 = p_carrid.
l_col2 = p_connid.
l_res_ref = l_stmt_ref->execute_query( l_stmt ).
* Set output structure
GET REFERENCE OF l_wa INTO l_dref.
l_res_ref->set_param_struct( l_dref ).
* Show result
WHILE l_res_ref->next( ) > 0.
WRITE: / 'Result:', l_wa-carrid, l_wa-connid.
ENDWHILE.
* Close the result set object
l_res_ref->close( ).
Otherwise you can also use the FM DB_EXECUTE_SQL...
Kr,
m. -
Using a Variable for Table Name with a cursor
Hello All
Is it possible to use a Parameter passed to a procedure as the table name
in a cursor selection statment. I thought the below would work but I get
a error. Does anyone have any ideas?? The Error is listed below to.
Here's the code I just complied
CREATE OR REPLACE PROCEDURE Dup_Add(NEWQATABLE IN VARCHAR2) IS
CURSOR c1 IS SELECT MUNI,PROV FROM NEWQATABLE GROUP BY MUNI, PROV;
c1rec c1%ROWTYPE;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO c1rec;
EXIT WHEN c1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(c1rec.MUNI);
END LOOP;
CLOSE c1;
END;
Here is the errors
LINE/COL ERROR
3/8 PLS-00341: declaration of cursor 'C1' is incomplete or malformed
3/15 PL/SQL: SQL Statement ignored
3/38 PLS-00201: identifier 'NEWQATABLE' must be declared
5/7 PL/SQL: Item ignored
10/3 PL/SQL: SQL Statement ignored
10/17 PLS-00320: the declaration of the type of this expression is
incomplete or malformed
12/3 PL/SQL: Statement ignored
12/24 PLS-00320: the declaration of the type of this expression is
incomplete or malformed
LINE/COL ERROR
Thanks
PeterIf you are going to have a table name or a column name as a parameter, then you have to open the cursor dynamically. The following example uses Native Dynamic SQL (NDS) to open a ref cursor dynamically. I also eliminated the group by clause, since it is intended for use with aggregate functions and you weren't using an aggregate function. Also notice that there are some other differences in terms of defining variables and fetching and so forth.
SQL> CREATE TABLE test_table
2 AS
3 SELECT deptno AS muni,
4 dname AS prov
5 FROM dept
6 /
Table created.
SQL> CREATE OR REPLACE PROCEDURE Dup_Add
2 (newqatable IN VARCHAR2)
3 IS
4 TYPE cursor_type IS REF CURSOR;
5 c1 cursor_type;
6 c1muni NUMBER;
7 c1prov VARCHAR2 (20);
8 BEGIN
9 OPEN c1 FOR 'SELECT muni, prov FROM ' || newqatable;
10 LOOP
11 FETCH c1 INTO c1muni, c1prov;
12 EXIT WHEN c1%NOTFOUND;
13 DBMS_OUTPUT.PUT_LINE (c1muni || ' ' || c1prov);
14 END LOOP;
15 CLOSE c1;
16 END;
17 /
Procedure created.
SQL> SHOW ERRORS
No errors.
SQL> SET SERVEROUTPUT ON
SQL> EXECUTE dup_add ('test_table')
10 ACCOUNTING
20 RESEARCH
30 SALES
40 OPERATIONS
PL/SQL procedure successfully completed. -
How to insert variable for table name in Select statement ?
I am creating a stored procedure which will take two table names as IN parameters. Within the procedures I would like to use the parameters in the following manner;
SELECT count(*)
INTO v_target_cnt
FROM TargetTable;
TargetTable is one of the parameters passed in. When I do this however it does not recognize the parameter. I have tried assigning the parameter to a local variable and using the variable, with not luck.
Any help....thanksNull,
What you are describing is called a LEXICAL parameter, which is allowed (preceded by an ampersand) in sql but not in pl/sql because it would not be possible to compile it. That is why you need to use Andrew's suggestion to make the sql dynamic. In older versions you would need to use DBMS_SQL which is horrible and now thankfully redundant. -
Dynamic table names without dynamic sql?
I am trying to figure out a way to use table names as variables without using dynamic sql.
So for instance, I have...
execute immediate 'INSERT INTO '||vTABLE||' VALUES ('test')';
and
execute immediate 'INSERT INTO TABLE1 SELECT * FROM '||vTable;
Is there any other way to do these without the dynamic sql in Oracle 10.2g?I am trying to figure out a way to use table names as variables without using dynamic sql. Well I guess it makes a change from perpetual motion machines or cold fusion.
Are you doing this as a purely academic exercise or do you have something against dynamic SQL?
Cheers, APC
blog: http://radiofreetooting.blogspot.com -
Problem using alias field names in a sql query
Hello,
I have a question regarding a simple Oracle database SQL query writeup:
In the following (badly written but properly working) SQL query:
Query 1:
select
soe.field1,
(soe.field2 + soe.field3) as field4,
(soe.field5 - (soe.field2 + soe.field3)) as field6,
(select comp.parValue*soe.field7
from
CompTable comp) as parValue,
(select soe.field8 - (comp.parValue*soe.field7+ soe.field9)
from
CompTable comp) as field10
from
SomeTable soe
PROBLEM 1:
I am re writing the code (soe.field2 + soe.field3) to get the alias field4 or column name field4 that I have created on the fly in the previously for use with the following fields. Can't I rewrite the query as follows. There is something simple missing!
Query 2:
select
soe.field1,
(soe.field2 + soe.field3) as field4,
soe.field5 - field4 as field6, <<< field4 does not work here
(select
comp.parValue*soe.field7
from
CompTable comp) as parValue,
(select
soe.field8 - (comp.parValue*soe.field7+ soe.field9)
from
CompTable comp) as field10
from
SomeTable soe
PROBLEM 2:
Similar to the above problem, I was thinking to get a field parValue out of the CompTable table and re-use many times rather than the code shown in Query 1:
Query 3:
select
soe.field1,
(soe.field2 + soe.field3) as field4,
soe.field5 - field4 as field6,
soe.field7* (select comp.parValue from CompTable comp) as parValue1,
soe.field8 - (parValue1*soe.field7+ soe.field9) as field10 <<<< parvalue1 does not work here
parValue1*soe.field9 as TaxCondition <<<< parvalue1 does not work here
from
SomeTable soe
See that the query becomes so simple, but the above query does not work. There is something fundamentally wrong in my usage of the alias field names in creating other fields. The Query1 seems to be the only working option but its very slow as I am redoing and re-writing the whole code again and again to get the parValue field out of the CompTable table for use to create many other fields.
I will appreciate if you can guide me in the right direction on this issue.
Thanks and Regards
RamaSELECT tmp.contract_no, tmp.Actual, tmp.Actual - tmp.NbHours
FROM ( SELECT t.contract_no, sum(l.hrs) AS Actual, (c.labour_hours * c.labour_progress_per) / 100 AS NbHours
FROM TASK_DELEGATION t
INNER JOIN COST_CODE c
ON t.cost_code = c.cost_code AND t.contract_no = c.contract_no AND t.is_inactive=0
INNER JOIN Labour.dbo.LABOURALLOT l
ON l.contractNo = c.contract_no AND l.costcode = c.cost_code AND l.pm = 'N'
GROUP BY t.contract_no, c.labour_hours, c.labour_progress_per
) tmp -
Using a derived table name in a select ...
In SQL or PL/SQL am I able to use the derived value of a colu,n (which holds a table name) to run an SQL.
Basically I want to perform a "select count(*) from table" where table is a list of tables held in another, eg all_tables.
EG:
all_tables has
TABLE1
TABLE2
TABLE3
and I want to get
TABLE1 100
TABLE2 50
TABLE3 110
ThanksSQL> ed
Wrote file afiedt.buf
1 declare
2 cursor cur_tables is
3 select table_name
4 from user_tables;
5 v_cnt NUMBER;
6 begin
7 for t in cur_tables
8 loop
9 execute immediate 'select count(*) from '||t.table_name into v_cnt;
10 dbms_output.put_line('Table: '||t.table_name||' ('||v_cnt||')');
11 end loop;
12* end;
SQL> /
Table: PRE_MAP_LOG (150935)
Table: LOG_SRC (126)
Table: SRC_LOOKUP (10)
Table: T (1)
Table: MYDONORS (22)
Table: CHANGE_LOG (347)
Table: CHANGE_VARCHAR2 (461)
Table: DO_MAP_LOG (50)
Table: CHANGE_DATE (96)
Table: CHANGE_NUMBER (561)
PL/SQL procedure successfully completed.
Maybe you are looking for
-
when trying to update apps i keep getting billing method incorrect(this is on iphone 4s) i hsve tried this store,apple id,view id,payment info but does not offer me the none option,i can npt update my phone any ideas anybody please?
-
Display key date of hierarchy in the query
Hello, we have a query that uses a hierarchy with the time depending structure. The key date of this hierarchy has been restricted with a variable and can be entered by user in the query selection screen. Is there any way to display this key date var
-
Don't know how to format external hard drive
dont know how to format my new external hard drive can anyboby help me not very good with computers thanx
-
Regarding problem in cardinality for context in alv display
Hello, I have a problem with caridianalty with context when displaying in alv. If the cardinality is 1..N then its displaying the data in alv. But if cardinality is changed to 0..N then its giving a cardinality error. what i want to do is if the
-
Can anyone see whats up with this progam PLEASSSE!
public class Mean public static void main(String args[]) int counter = 0; int sum = 0; float mean = 0; float dev = 0; float sum2 = 0; float total = 0; for(int x =1;x<=5;x++)