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....thanks
Null,
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.
Similar Messages
-
How to use bind variable value for table name in select statement.
Hi everyone,
I am having tough time to use value of bind variable for table name in select statement. I tried &p37_table_name. ,
:p37_table_name or v('p37_table_name) but none worked.
Following is the sql for interactive report:
select * from v('p37_table_name') where key_loc = :P37_KEY_LOC and
to_char(inspection_dte,'mm/dd/yyyy') = :P37_INSP_DT AND :p37_column_name is not null ;
I am setting value of p37_table_name in previous page which is atm_state_day_insp.
Following is error msg:
"Query cannot be parsed, please check the syntax of your query. (ORA-00933: SQL command not properly ended) "
Any help would be higly appreciated.
RajInterestingly enough I always had the same impression that you had to use a function to do this but found out from someone else that all you need to do is change the radio button from Use Query-Specific Column Names and Validate Query to Use Generic Column Names (parse query at runtime only). Apex will substitute your bind variable for you at run-time (something you can't normally do in pl/sql without using dynamic sql)
-
How to pass parameter for table name in form6i.
Hi ,
I am facing the problem to pass parameter for table name in form6i.
If any solution please infirm me earliest to my mail id.
([email protected])
example:
begin
select ename into :ename
from :tab_name
where empno =7788;
end;
It gives error as bad bind variable 'tab_name'
*** where :ename and :tab_name are form fields
Thanking you,
Balasahebobject name not taken as table --> what do u mean by
this?
Please be more clear..
Regards
PriyaI have two block. First block I am displaying all the table using user_objects table. Another block I want display, user which table selected, corresponding table all the records. -
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); -
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. -
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. -
Variable as table name in update statement
Hi everyone,
I am trying to update a table whose name is based on bind variables in the form and is unknown until runtime. However, I haven't been able to find a way to do this. I'm currently trying the FORMS_DDL built-in, but no success here either. Has anyone ever done this?
DECLARE
matrix_temp_table VARCHAR2(50);
BEGIN
matrix_temp_table := 'TEMP_'||:mgmt_matrix_master.div_idkey||'_'||TO_CHAR(:mgmt_matrix_master.dept_idkey);
FORMS_DDL('UPDATE '||matrix_temp_table||' SET create_date = :mgmt_matrix_master.create_date');
END;You're right, issuing the statement using the table name itself only works outside of FORMS_DDL. After trudging through the documentation it seems the best way to accomplish what I am trying to do is by using the EXEC_SQL package. But, once again, I cant get this to work either. It seems to me what I am trying to do is a fairly simple thing, but apparently not. I'm now trying to use this code, but the table still isn't being updated.
PROCEDURE update_matrix_temp_table IS
matrix_temp_table VARCHAR2(50);
update_connid EXEC_SQL.ConnType;
update_cursor EXEC_SQL.CursType;
ignore PLS_INTEGER;
BEGIN
matrix_temp_table := 'TEMP_'||:mgmt_matrix_master.div_idkey;
update_connid := EXEC_SQL.CURR_CONNECTION;
update_cursor := EXEC_SQL.OPEN_CURSOR(update_connid);
EXEC_SQL.PARSE(update_connid, update_cursor, 'UPDATE '||matrix_temp_table||' SET emp_no = '||:mgmt_matrix_master.emp_no);
ignore := EXEC_SQL.EXECUTE(update_connid, update_cursor);
EXEC_SQL.PARSE(update_connid, update_cursor, 'COMMIT');
ignore := EXEC_SQL.EXECUTE(update_connid, update_cursor);
EXEC_SQL.CLOSE_CURSOR(update_cursor);
EXCEPTION
WHEN EXEC_SQL.PACKAGE_ERROR THEN
IF EXEC_SQL.LAST_ERROR_CODE(update_connid) != 0 THEN
Message('ERROR (source: ' ||TO_CHAR(EXEC_SQL.LAST_ERROR_CODE(update_connid))|| '): ' ||EXEC_SQL.LAST_ERROR_MESG(update_connid));
END IF;
END; -
How to declare variable for Table type in the ABAP Editor
Hi!
I have Table Type 'FIELDNAME_TAB' (Table of fieldnames). I want to pass the list of fieldnames to this Table Type in the ABAP Editor.
Can anyone help me in this?You would declare the internal table like so.
data: itab type FIELDNAME_TAB.
data: wa like line of itab.
wa = 'This_value'.
append wa to itab.
Regards.
Rich Heilman
Message was edited by:
Rich Heilman -
Inserting variables to table by "execute immediate' statement
EXECUTE IMMEDIATE 'INSERT INTO aTABLETKA_HISTORY
(update_id,
update_type,
update_date,
old_db_version,
description,
patch_number)
values
(' || m_id(v_rec) || ',
'||m_package(v_rec)||',
''07-NOV-07'',
''snezi'',
'||m_desc(v_rec)||',
'||m_new(v_rec)||')';
ORA-00917: missing comma
ORA-06512: at line 142
i cannot solve this,. can anybody help me?
i have simillar insert:
EXECUTE IMMEDIATE 'INSERT INTO ab_table_VERSION(property,version) values (''wiz_datalink'',' || my_version || ')';
and this one statement work correctlyDo NOT use "execute immediate". What is the reason for trying it this way?
If the column update_date is of type date, then you have a bug in the code, as you are trying to insert a string. If it is not a date data type, then you have a bug, because it is not of type date.
What is the outcome of:
INSERT INTO aTABLETKA_HISTORY (update_id, update_type, update_date,
old_db_version, description, patch_number)
values (m_id(v_rec), m_package(v_rec), to_date('07-NOV-2007', 'dd-MON-yyyy'),
snezi, m_desc(v_rec), m_new(v_rec) )
/ -
Short table name in SELECT statement
Does Oracle support anything like the following sintax:
SELECT * FROM TABLE1 AS T1
Thanks in advancesyntex use like....
create table T1 select * from T2.
test@ORA10G>
test@ORA10G> create table t2 (x number);
Table created.
test@ORA10G> create table T1 select * from T2;
create table T1 select * from T2
ERROR at line 1:
ORA-00922: missing or invalid option
test@ORA10G>
test@ORA10G>pratz -
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. -
How to insert into a table with a nested table which refer to another table
Hello everybody,
As the title of this thread might not be very understandable, I'm going to explain it :
In a context of a library, I have an object table about Book, and an object table about Subscriber.
In the table Subscriber, I have a nested table modeling the Loan made by the subscriber.
And finally, this nested table refers to the Book table.
Here the code concerning the creation of theses tables :
Book :
create or replace type TBook as object
number int,
title varchar2(50)
Loan :
create or replace type TLoan as object
book ref TBook,
loaning_date date
create or replace type NTLoan as table of TLoan;
Subscriber :
create or replace type TSubscriber as object
sub_id int,
name varchar2(25)
loans NTLoan
Now, my problem is how to insert into a table of TSubscriber... I tried this query, without any success...
insert into OSubscriber values
*(1, 'LEVEQUE', NTLoan(*
select TLoan(ref(b), '10/03/85') from OBook b where b.number = 1)
Of course, there is an occurrence of book in the table OBook with the number attribute 1.
Oracle returned me this error :
SQL error : ORA-00936: missing expression
00936. 00000 - "missing expression"
Thank you for your help1) NUMBER is a reserved word - you can't use it as identifier:
SQL> create or replace type TBook as object
2 (
3 number int,
4 title varchar2(50)
5 );
6 /
Warning: Type created with compilation errors.
SQL> show err
Errors for TYPE TBOOK:
LINE/COL ERROR
0/0 PL/SQL: Compilation unit analysis terminated
3/1 PLS-00330: invalid use of type name or subtype name2) Subquery must be enclosed in parenthesis:
SQL> create table OSubscriber of TSubscriber
2 nested table loans store as loans
3 /
Table created.
SQL> create table OBook of TBook
2 /
Table created.
SQL> insert
2 into OBook
3 values(
4 1,
5 'No Title'
6 )
7 /
1 row created.
SQL> commit
2 /
Commit complete.
SQL> insert into OSubscriber
2 values(
3 1,
4 'LEVEQUE',
5 NTLoan(
6 (select TLoan(ref(b),DATE '1985-10-03') from OBook b where b.num = 1)
7 )
8 )
9 /
1 row created.
SQL> select *
2 from OSubscriber
3 /
SUB_ID NAME
LOANS(BOOK, LOANING_DATE)
1 LEVEQUE
NTLOAN(TLOAN(000022020863025C8D48614D708DB5CD98524013DC88599E34C3D34E9B9DBA1418E49F1EB2, '03-OCT-85'))
SQL> SY. -
How to insert data in table UI elements
Hi Guys,
Here is my questions. How to insert data in table UI elements.
Here i try to insert data by using Add button
data:
Node_Item type ref to If_Wd_Context_Node.
Node_Item = wd_comp_controller->get_data_node( ).
data:
lr_table_line type ref to ITEM.
lr_table_line = Node_Item->create_element( ).
field-symbols:
<ls_table> type any.
assign lr_table_line->* to <ls_table>.
Node_Item->bind_element(
new_item = <ls_table>
set_initial_elements = abap_false
index = 1 ).
But i got syntax error the result type of the function method cannot not be converted in to the type of lr_table_line.
And i set cardinality and selection as 0.n.
Pls, let me know for the soulutions
Chandru
Message was edited by:
chandrasekar muthuvelrajChadru, another option is for you to bind the table UI field to an internal table and to populate the internal table. Then, automatically, your Table UI field will be populated with the data from the internal table. Here is the code that does that and works for me. Good luck!
method FILL_DATA .
DATA: node_level1 type ref to if_wd_context_node,
node_level2 type ref to if_wd_context_node,
node_items type ref to if_wd_context_node,
stru_ResItems type BAPI2093_RES_ITEM,
tab_ResItems TYPE TABLE OF BAPI2093_RES_ITEM,
n type i.
node_level1 = wd_context->get_child_node( name = 'BAPI_RESERVATION_CRE' ).
node_level2 = node_level1->get_child_node( name = 'CHANGING' ).
node_items = node_level2->get_child_node( name = 'RESERVATIONITEMS' ).
n = 2.
do n times.
insert stru_ResItems into table tab_ResItems.
enddo.
node_items->bind_table( tab_ResItems ).
endmethod. -
Can substitution strings be used for table name references?
Hi,
I was wondering if it's possible to use substituion strings for table names in SQL queries. This would allow for me to edit all references to a table at one location. For instance, if a table name or dblink changed, I could edit the substitution string or application item to ensure all the queries reference the new table.
For example:
select * from &table1.
table1 would be the substitution string for the actual table name
I know this is possible if I used a pl/sql function returning a query, but I would much rather use a substition string in a SQL query.
Thanks in advance.
Briani think not
because how create the fields of * in this case
in the other because all is dynamic, i think that you obtain only an error -
How to create variant for table/view ?
Hi,
When I go through SM30, I find a radio button called variant. I don't know the effect.
Can anyone tell me how to create variant for table / view ?
I want to know when we need to create variant for table/view.
Best regards,
Chris Guhi ,
Whenever you start a program in which selection screens are defined, the system displays a set of input fields for database-specific and program-specific selections. To select a certain set of data, you enter an appropriate range of values.
For further information about selection screens, refer to Selection Screens in the ABAP User's Guide.
If you often run the same program with the same set of selections (for example, to create a monthly statistical report), you can save the values in a selection set called a variant
Procedure
To create a new variant:
1. On the ABAP Editor initial screen, enter the name of the program for which you want to create a variant, select Variants, and choose Change.
2. On the variant maintenance initial screen, enter the name of the variant to be created.
Note the naming convention for variants (see below).
3. Choose Create.
If the program has more than one selection screen, a dialog box for screen assignment appears. The dialog box does not appear if the program only has one selection screen. The selection screen appears in this case.
4. If there is more than one selection screen, select the screens for which you want to create the variant
5. Choose Continue.
The (first) selection screen for the report appears.
If your program has more than one selection screen, use the scroll buttons in the left-hand corner of the application toolbar to navigate between them and to fill the fields with values. If you keep scrolling forwards, the Continue button appears on the last selection screen.
6. Enter the desired selection values, including multiple selection and dynamic selection.
7. Choose Continue.
Maybe you are looking for
-
I want to transfer my iPhoto pics to my new computer, but how?
I have an old dome based iMac running tiger. I want to transfer data to my newer duo core iMac. I bought a USB 32 gb storage device by lexor to load data from my old and put it on my new. When I plug the device into the USB port I see nothing to indi
-
No other details, other than it just won't start or open when I upgrade. It's in my task manager list, but the GUI does not come up.
-
Console throws errors when check servers as user in Monitor role
Hi , I am getting the following error when trying to Login to console as a user with monitor role and This is working normal if logged in as Administrator, i am using WebLogic Server 9.2 MP3 - ####<May 5, 2010 5:14:06 AM EDT> <Error> <netuix> <isdwlp
-
My G5 screen has faint lines going across it??
My G5 screen has faint diaginal lines going across it, but when I am on the internet it is crisp and none of the lines show up??? Has anyone else ran into this?
-
JDeveloper 10.1.3.2.0 1) Offline database table -> refresh from my_connection 2) Could have done some changes to the offline table here, but it is not needed to run into problems 3) (The same) Offline database table -> Generate or Reconcile to my_con