Reading dynamic sql columns in coldfusion
I have a query which has static as well as dynamic columns. something like below:
<cfset vMarks = "marks1, marks2, marks3">
<cfquery name="querymarks" datasource = "abc">
SELECT firstname, lastname,
<cfloop from="1" to="listlen(vMarks)" index="index">
marks_#index# <cfif #index# NEQ listlen(vMarks)>,</cfif>
</cfloop>
</cfquery>
The query result set will look like below:
firstname lastname marks1 marks2 marks3 ...
abc abc 112 113 114
def def 121 122 123
So when I am using coldfusion to display the above resultset I am doing the below:
<table>
<tr>
<td>FIRST NAME</td>
<td>FIRST NAME</td>
<td>FIRST NAME</td>
</tr>
<cfoutput query="querymarks">
<tr>
<td>querymarks.firstname</td>
<td>querymarks.lastname</td>
<cfloop from="1" to="listlen(vMarks)" index="index">
<td>querymarks.marks_#index#</td>
</cfloop>
</tr>
</cfoutput>
</table>
The number of marks column is dynamic but I have a variable which stores the list of marks. I am facing problem in displaying the marks with coldfusion. Can anyone let me know if this can be done?
It's not immediately apparent in the docs, but one can use associative array notation with queries, eg:
myQuery[myColumn][myRow]
Where myQuery is the name of a query variable, myColumn is a column name or a string containing a column name, and myRow is the row number (positive integer) you want.
You can also get query metadata with getMetatdata(myQuery), which lists the columns in the order they were queried for (unlike myQuery.columnList which alphabeticised it, for some stupid reason best known to some Allaire developer of yore).
Adam
Similar Messages
-
Reading dynamic table column based on user selection
Hi there,
I am having a problem of reading and manipulating the data stored in a standard SAP table. The following example simulates the table and what i am trying to do:
Table: Storing sales data for sales person
SALES_PERSON REGION YEAR MTH_S1 MTH_S2 MTH_S3 MTH_S4...
Richard S NORTH 2007 100 200 300 400
John K SOUTH 2007 50 100 100 20
Brad P NORTH 2007 300 100 100 50
User have have the following selection option:
1. Month.
The program will calculate the sales based on the individual month selected
Example, if user select Month = 3, then program take only MTH_S3 column value
So total sales = 300100100=500
2. Month range
The program will calculate the sales based on the month range selected
Example, if user select Month 2 to 4, then program take MTH 2 to MTH_S4 columns value
So total sales = 400 (for MTH_S2) + 500 (for MTH_S3) + 470 (for MTH_S4) = 1370
How should i write the logic or code for this requirement?
Hope someone can help.
Thanks,
Pang HKTry something like this
TABLES:
t247.
SELECT-OPTIONS:
s_month FOR t247-mnr NO-EXTENSION.
DATA:
BEGIN OF fs_data,
person(30),
area(10),
year(4),
mon1 TYPE kbetr,
mon2 TYPE kbetr,
mon3 TYPE kbetr,
mon4 TYPE kbetr,
mon5 TYPE kbetr,
END OF fs_data,
t_data LIKE STANDARD TABLE OF fs_data,
w_no_months TYPE i,
w_kbetr TYPE kbetr,
w_total TYPE kbetr.
LOOP AT t_data INTO fs_data.
CLEAR w_kbetr.
DO 5 TIMES VARYING w_kbetr FROM fs_data-mon1
NEXT fs_data-mon2.
IF sy-index IN s_month.
w_total = w_total + w_kbetr.
ENDIF.
ENDDO.
ENDLOOP.
change the value 5, according to the no.of months in ur internal table -
Dynamic SQL Query to Find Special Characters in Table columns
Hi,
I am new to OTN FORUMS.
I am trying to find the columnsi of a table which have special characters in them.
I am planning on using this query
select ' select INSTR('||column_name||', chr(0))
from '||table_name||'where INSTR('||column_name||', chr(0)) >0' from user_tab_columns
where table_name='Account'
and spool the output to run as a script.
Is this the right way or do u suggest any modifications to the query?
Thanks in advance.Hi,
I think your basic approach is right. Since you can't hard-code the table- or column names into the query, you'll need dynamic SQL.
Instead SQL-from-SQL (that is, writing a pure SQL query, whose output is SQL code), you could do the whole job in PL/SQL, but I don't see any huge advantage either way.
When you say "Special character<b>s</b>", do you really mean "one given special character" (in this case, CHR(0))?
Will you ever want to search for multiple special characters at once?
What if table foo has a column bar, and in 1000 rows of foo, bar contains CHR (0). Do you want 1000 rows of output, each showing the exact position of the first CHR(0)? If the purpose is to look at theese rows later, shouldn't you include the primary key in the output? What if CHR(0) occurs 2 or more times in the same string?
If you'd rather have one row of output, that simply says that the column foo.bar sometimes contains a CHR(0), then you could do something like this:
SELECT 'foo', 'bar'
FROM dual
WHERE EXISTS (
SELECT NULL
FROM foo
WHERE INSTR ( bar
, CHR (0)
) > 0
); -
Dynamic SQL in Formula Column in OracleReports6i
Following code is in formula column of my report. passing dynamic sql str1(actullay, this string comes from after parameter trigger form) into SQL and executing thru DBMS_SQL.PARSE function. it's failed with 'Fatal PL/SQL error occured' ...
Coupld any one help me on this...
function CF_1FORMULA0006 return Number is
Credits1 NUMBER(10,2);
str1 VARCHAR2(50) := 'AND b.PROGRAMID = 2 ';
c1 INTEGER := dbms_sql.open_cursor;
c2 INTEGER;
begin
begin
dbms_sql.parse(c1,
'SELECT NVL(SUM(a.AMOUNT),0) INTO Credits1' | |
'FROM SPONSOR_TRAN_DATA a, SPONSOR b ' | |
' WHERE ' | |
' a.TRANTYPE = 41 ' | |
' AND a.SPONSORID = b.SPONSORID ' | |
str1 | |
'AND a.amount > 0 ' | |
'AND a.timestamp >= :reportdate ' | |
'AND a.timestamp < :reportdate + 1' ,2);
c2 := dbms_sql.execute(c1);
exception
when no_data_found then
Credits1 := 0;
end;
return Credits1;
end;
Thanks in advance......It looks like forms are not supporting text functions like FR yet, I gave it a try <<MemberName("<Formname>","<POV DIM Name>)>> in the formula header area and it didn't like it. It is just displaying what ever I typed in there.
-
How to determine column length semantics through ANSI Dynamic SQL ?
I am looking for a way to determine the length semantics used for a column through ANSI Dynamic SQL.
I have a database with NLS_CHARACTERSET=AL32UTF8.
In this database I have the following table:
T1(C1 varchar2(10 char), C2 varchar2(40 byte))
When I describe this table in SQL*Plus, I get:
C1 VARCHAR2(10 CHAR)
C2 VARCHAR2(40)
In my Pro*C program (mode=ansi), I get the select statement on input, use PREPARE method to prepare it and then use the GET DESCRIPTOR method to obtain colum information for output:
GET DESCRIPTOR 'output_descriptor' VALUE :col_num
:name = NAME, :type = TYPE,
:length = LENGTH, :octet_length = OCTET_LENGTH
For both C1 and C2 I get the following:
:type=12
:length=40
:octet_length=40
So, even if I know that my database is AL32UTF8, there doesn't seem to be a way for me to determine whether char or byte length semantics were used in C1 and C2 column definitions.
Does anybody know how I can obtain this information through ANSI Dynamic SQL?
Note: the use of system views such as ALL_TAB_COLUMNS is not an option, since we wish to obtain this information even for columns in a complex select statements which may involve multiple tables.
Note: I believe OCI provides the information that we need through OCI_ATTR_DATA_SIZE (which is in bytes) and OCI_ATTR_CHAR_SIZE (which is in chars). However, switching to OCI is something we would like to avoid at this point.Yes, I was wondering which forum would be the best for my question. I see similar questions in various forums, Call Interface, SQL and PL/SQL and Database - General. Unfortunately there is no Pro*C or Dynamic SQL forum which would be my first choice for posting this question.
Anyway I now posted the same question (same subject) in the Call Interface forum, so hopefully I'll get some answers there.
Thank you for the suggestion. -
Save a dynamic sql into a column
Hello,
I need to save dynamic SQL into a column called STR in a table.
I have a insert into table A( id, fname, lname)
values(1, 'John', 'Smith');
I have a requirement to save the DML statement that user executed such as this insert statement into table 'A'.
I have to save this into anoter table called 'B' in the 'STR' column.
I have to save that whole insert statement into a cloumn 'STR' in table 'B'
How can do this?
Thank you..This is not for auditing. The shop wants to save the DML statements in a table when a user does updates and inserts.. at the same time they want to build dynamic sql for this as a string such as update emp set where empno = 1 etc....
could you give me an example please.
Thanks a bunch.... -
How to rename C00n generic column names in a Dynamic SQL report
I have a an interface whereby the user can select 1 to 60 (upper limit) columns out of 90 possible columns (using a shuttle) from one table before running a report.
To construct the SQL that will eventually execute, I'm using a "PLSQL function body returning SQL query" with dynamic SQL. The only problem is that I have to use "Generic Column Names" option to be able to compile the code and end up with c001 to c060 as the column names.
How can I use the names of the selected columns as the report headings rather than c001, C002... etc?
I do not know beforehand which columns, or how many columns or the order of the selected columns.
I know Denes K has a demo called Pick Columns but I can't access his code. I have a hunch though that he may be just using conditions to hide/show the apropriate columns.
thanks in advance
PaulPHi Paul
I would change the Heading Type in the Report Details screen to PLSQL and use the shuttle item to return the column values. e.g.
RETURN :p1_shuttle;
I'm assuming the shuttle already has a colon separated list of the column headings in the correct order?
I hope that helps
Shunt -
How to use the column names generated from Dynamic SQL
Hi,
I have a problem with Dynamic SQL.
I have written an SQL which will dynamically generate the Select statement with from and where clause in it.
But that select statement when executed will get me hundreds of rows and i want to insert each row separately into one more table.
For that i have used a ref cursor to open and insert the table.
In the select list the column names will also be as follows: COLUMN1, COLUMN2, COLUMN3,....COLUMNn
Please find below the sample code:
TYPE ref_csr IS REF CURSOR;
insert_csr ref_csr;
v_select VARCHAR2 (4000) := NULL;
v_table VARCHAR2 (4000) := NULL;
v_where VARCHAR2 (4000) := NULL;
v_ins_tab VARCHAR2 (4000) := NULL;
v_insert VARCHAR2 (4000) := NULL;
v_ins_query VARCHAR2 (4000) := NULL;
OPEN insert_csr FOR CASE
WHEN v_where IS NOT NULL
THEN 'SELECT '
|| v_select
|| ' FROM '
|| v_table
|| v_where
|| ';'
ELSE 'SELECT ' || v_select || ' FROM ' || v_table || ';'
END;
LOOP
v_ins_query :=
'INSERT INTO '
|| v_ins_tab
|| '('
|| v_insert
|| ') VALUES ('
|| How to fetch the column names here
|| ');';
EXECUTE IMMEDIATE v_ins_query;
END LOOP;
Please help me out with the above problem.
Edited by: kumar0828 on Feb 7, 2013 10:40 PM
Edited by: kumar0828 on Feb 7, 2013 10:42 PM>
I Built the statement as required but i need the column list because the first column value of each row should be inserted into one more table.
So i was asking how to fetch the column list in a ref cursor so that value can be inserted in one more table.
>
Then add a RETURNING INTO clause to the query to have Oracle return the first column values into a collection.
See the PL/SQL Language doc
http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/returninginto_clause.htm#sthref2307 -
Column names dynamically in Dynamic SQL
Hi All,
We can use Table Name dynamically in Dynamic SQL.
Can we use column names dynamically?
Thanks,
UmasankarHi Todd Barry,
Thanks lot for your immediate response.
Could you please tell me, how can we use column name dynamically?
I tried but, I didnt get the correct result.
Here is my coding.
Declare
SQL_String Varchar2(2000);
Category varchar2(50):= 'ELECTRO_PLATING_413';
Type ConstCurTyp is REF CURSOR;
Const_Cv ConstCurTyp;
vLab_name varchar2(80);
Begin
Execute Immediate 'Truncate table tto_lab_names';
dbms_output.put_line(category);
dbms_output.put_line(' ');
SQL_String := 'Select lab_name from tto_constituents where :category is not null';
Open Const_cv for SQL_String using category;
Loop
Fetch Const_Cv into vLab_Name;
Exit When Const_Cv%NotFound;
Insert into lab_names values(vLab_name);
End Loop;
Commit;
Close Const_Cv;
End;
I am getting all the lab_names as result.
Thanks,
Umasankar
null -
Dynamic SQL Pivoting(Converting Row to Columns)
Hi All,
I am using Oracle 9i (Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production)
and also 10g version
I am facing difficulties to find out the logic for
converting the set of values in one of the columns into the column headings for the entire query.
create TABLE my_tab ( deptno VARCHAR2(5), job VARCHAR2(50), sal NUMBER);
insert into my_tab ( deptno,JOB, sal) values ( 10, 'ANALYST', 23000);
insert into my_tab ( deptno,JOB, sal) values ( 10, 'SALESMAN', 1500);
insert into my_tab ( deptno,JOB, sal) values ( 10, 'CLERK', 3550);
insert into my_tab ( deptno,JOB, sal) values ( 20, 'SALESMAN', 700);
insert into my_tab ( deptno,JOB, sal) values ( 20, 'ANALYST', 4200);
insert into my_tab ( deptno,JOB, sal) values ( 30, 'SALESMAN', 5600);
insert into my_tab ( deptno,JOB, sal) values ( 30, 'CLERK', 12000);
insert into my_tab ( deptno,JOB, sal) values ( 30, 'ANALYST', 19000);
COMMIT;
SELECT * FROM my_tab
DEPTNO ______ JOB ________ SAL
10 ______ ANALYST ________ 23000
10 ______ SALESMAN ________ 1500
10 _______ CLERK ________ 3550
20 _______ SALESMAN ________ 700
20 _______ ANALYST ________ 4200
30 _______ SALESMAN ________ 5600
30 _______ CLERK _______ 12000
30 _______ ANALYST _______ 19000
--And I wish to convert it into this structure:
DEPTNO ________ ANALYST ________ SALESMAN _________ CLERK
10 ________ 23000 ________ 1500 _________ 3550
20 ________ 4200 ________ 700 _________ NULL
30 ________ 19000 ________ 5600 _________ 12000
It may be dynamic. i.e Later i inserted more two records into My_tab.
insert into my_tab ( deptno,JOB, sal) values ( 20, 'CLERK', 3400);
insert into my_tab ( deptno,JOB, sal) values ( 30, 'MANAGER', 48000);
So it should be dynamic.
output is like this.
DEPTNO ________ ANALYST ______ SALESMAN ______ CLERK ______ MANAMGER
10 ________ 23000 ______ 1500 ______ 3550 ______ NULL
20 ________ 4200 ______ 700 ______ 3400 ______ NULL
30 ________ 19000 ______ 5600 ______ 12000 ______ 48000
Please help me regarding this.
With warm regards,
PrasantaHi, Prasanta,
Displaying one column from many rows as many columns on one row is called Pivoting . The following thread shows the basics of how to pivot:
Help for a query to add columns
That example uses the aggregate COUNT function; you'll want SUM (or possibly MIN or MAX) instead.
Getting a dynamic number of columns requires Dynamic SQL . As a simpler alternative to pivoting and dynamic SQL, you might consider String Aggregation , where you concatenate a column from many rows into one big string, to be displayed on one row.
See the following thread for more about string aggregation and other options on pivoting into a variable number of columns:
Re: Report count and sum from many rows into many columns -
Column alias for spatial column within cursor loop using dynamic SQL
The following PL/SQL is trying to generate an error report for records or objects which are 3 dimensional or above. I have no issue execute one statement in SQLPLUS but I need to use the column alias for the spatial column. But, it is a different story using PL/SQL and dynamic SQL Any help will be great because I've been working on this for than 8 hours but with no luck! Thanks.
Here is the error I'm getting,
stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
ERROR at line 15:
ORA-06550: line 15, column 79:
PLS-00103: Encountered the symbol "P" when expecting one of the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between || member SUBMULTISET_
The symbol "* was inserted before "P" to continue.
and my PL/SQL is,
set serveroutput on size 100000 feedback off
declare
rs integer;
rs1 integer;
cur integer;
rp integer;
trs integer;
n integer;
un varchar2(30);
stmt varchar2(200);
begin
dbms_output.put_line(rpad('Table Name',40)||' Dimension');
dbms_output.put_line(rpad('-',53,'-'));
cur:= dbms_sql.open_cursor;
for t in (select column_name,table_name from user_sdo_geom_metadata where regexp_like(table_name, '[^[A-B]_[AB]$'))
loop
stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
dbms_sql.parse(cur, stmt, dbms_sql.native);
dbms_sql.define_column(cur, 1, rs);
dbms_sql.define_column(cur, 2, rs1);
rp:= dbms_sql.execute(cur);
n:=dbms_sql.fetch_rows(cur);
dbms_sql.column_value(cur, 1, rs);
dbms_sql.column_value(cur, 2, rs1);
dbms_output.put_line(rpad(t.table_name,38,'.')||rpad(rs,15)||rpad(rs1,15));
end loop;
dbms_sql.close_cursor(cur);
dbms_output.put_line(rpad('-',53,'-'));
end;
set serveroutput off feedback on feedback 6The following PL/SQL is trying to generate an error report for records or objects which are 3 dimensional or above. I have no issue execute one statement in SQLPLUS but I need to use the column alias for the spatial column. But, it is a different story using PL/SQL and dynamic SQL Any help will be great because I've been working on this for than 8 hours but with no luck! Thanks.
Here is the error I'm getting,
stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
ERROR at line 15:
ORA-06550: line 15, column 79:
PLS-00103: Encountered the symbol "P" when expecting one of the following:
. ( * @ % & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between || member SUBMULTISET_
The symbol "* was inserted before "P" to continue.
and my PL/SQL is,
set serveroutput on size 100000 feedback off
declare
rs integer;
rs1 integer;
cur integer;
rp integer;
trs integer;
n integer;
un varchar2(30);
stmt varchar2(200);
begin
dbms_output.put_line(rpad('Table Name',40)||' Dimension');
dbms_output.put_line(rpad('-',53,'-'));
cur:= dbms_sql.open_cursor;
for t in (select column_name,table_name from user_sdo_geom_metadata where regexp_like(table_name, '[^[A-B]_[AB]$'))
loop
stmt := 'select p.column_name.get_gtype(), id from '|| table_name p ' where p.column_name.get_gtype() > 2 ';
dbms_sql.parse(cur, stmt, dbms_sql.native);
dbms_sql.define_column(cur, 1, rs);
dbms_sql.define_column(cur, 2, rs1);
rp:= dbms_sql.execute(cur);
n:=dbms_sql.fetch_rows(cur);
dbms_sql.column_value(cur, 1, rs);
dbms_sql.column_value(cur, 2, rs1);
dbms_output.put_line(rpad(t.table_name,38,'.')||rpad(rs,15)||rpad(rs1,15));
end loop;
dbms_sql.close_cursor(cur);
dbms_output.put_line(rpad('-',53,'-'));
end;
set serveroutput off feedback on feedback 6 -
hi all,
I am using oracle 10g version.
I have one table but i do not have any unique id to identify the row.
I want to have a unique id temporarily in my select statement (dynamic sql) in a stored procedure while fetching the results, so that i can return my results along with the unique id through the cursor.
Please help me...
Thanks in advance to all...it depends if you have a more than one column that you can uniquely identify and put them together by concatenating you can have a unique id. or a rowid might help you to temporarily identify a row.
SQL> select e.* from employee e;
FNAME MINIT LNAME SSN BDATE ADDRESS SEX SALARY SUPERSSN DNO
John B Smith 123456789 09-Jan-1965 731 fONDREN, hOUSTON, TX M 30000.00 333445555 5
Frankin T Wong 333445555 08-Dec-1955 683 Voss, Houston,Tx M 40000.00 888665555 5
Alicia J Zelaya 999887777 19-Jul-1968 3321Castle, Spring, TX F 25000.00 987654321 4
Jennifer S Wallace 987654321 20-Jun-2041 291 Berry, Bellaire, TX F 43000.00 888665555 4
Ramesh K Narayan 666884444 15-Sep-1962 975 Fire Oak, Humble, TX F 38000.00 333445555 5
Joyce A English 453453453 31-Jul-1972 5631 Rice,Houston,TX F 25000.00 333445555 5
Ahmad V Jabbar 987987987 29-Mar-1969 980 Dallas,Houston, TX M 25000.00 987654321 4
James E Borg 888665555 10-Nov-2037 450 Stone, Houston, TX M 55000.00 1
8 rows selected
SQL> select rowid, e.* from employee e;
ROWID FNAME MINIT LNAME SSN BDATE ADDRESS SEX SALARY SUPERSSN DNO
AAD8pbAAJAAAJ4fAAA John B Smith 123456789 09-Jan-1965 731 fONDREN, hOUSTON, TX M 30000.00 333445555 5
AAD8pbAAJAAAJ4fAAB Frankin T Wong 333445555 08-Dec-1955 683 Voss, Houston,Tx M 40000.00 888665555 5
AAD8pbAAJAAAJ4fAAC Alicia J Zelaya 999887777 19-Jul-1968 3321Castle, Spring, TX F 25000.00 987654321 4
AAD8pbAAJAAAJ4fAAD Jennifer S Wallace 987654321 20-Jun-2041 291 Berry, Bellaire, TX F 43000.00 888665555 4
AAD8pbAAJAAAJ4fAAE Ramesh K Narayan 666884444 15-Sep-1962 975 Fire Oak, Humble, TX F 38000.00 333445555 5
AAD8pbAAJAAAJ4fAAF Joyce A English 453453453 31-Jul-1972 5631 Rice,Houston,TX F 25000.00 333445555 5
AAD8pbAAJAAAJ4fAAG Ahmad V Jabbar 987987987 29-Mar-1969 980 Dallas,Houston, TX M 25000.00 987654321 4
AAD8pbAAJAAAJ4fAAH James E Borg 888665555 10-Nov-2037 450 Stone, Houston, TX M 55000.00 1
8 rows selected
SQL> -
Can we use Dynamic SQL in Oracle Reports ?
Hi ,
Can we use Dynamic SQL in Oracle Reports ?
If yes please give some examples .
Thanx
sriniI believe the built-in package SRW.Do_Sql is what you are looking for
Example from the document:
/* Suppose you want to create a "table of contents" by getting the
** first character of a columns value, and page number on which its
** field fires to print. Assume that you want to put the "table of
contents"
** into a table named SHIP. You could write the following construct:
DECLARE
PAGE_NO NUMBER;
PAGE_FOR INDEX NUMBER;
SORT_CHAR CHAR(1);
CMD_LINE CHAR(200);
BEGIN
SORT_CHAR := :SORT_NAME ;
IF :CALLED = Y THEN
SRW.GET_PAGE_NUM(PAGE_FOR_INDEX);
SRW.USER_EXIT(RWECOP PAGE_FOR_INDEX
P_START_PAGENO);
SRW.MESSAGE(2,TO_CHAR(:P_START_PAGENO));
END IF;
SRW.GET_PAGE_NUM(PAGE_NO);
CMD_LINE := INSERT INTO SHIP VALUES
(||SORT_CHAR||,||TO_CHAR(PAGE_NO)||);
SRW.MESSAGE(2,CMD_LINE);
SRW.DO_SQL(CMD_LINE);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
NULL;
WHEN SRW.DO_SQL_FAILURE THEN
SRW.MESSAGE(1,FAILED TO INSERT ROW INTO SHIP TABLE);
WHEN OTHERS THEN
COMMIT;
END; -
I have the following scenario:
User Scott has two tables named USERINFO and EMP with the following description:
desc USERINFO
schema varchar2(30)
desc EMP
ename varchar2(30)
empno number(4)
User Blake has one table named EMP which looks like:
desc EMP
ename varchar2(30)
I want to write a function which would copy the values from Scott's EMP table to Blake's EMP table but I want to get the user Blake's name from USERINFO's schema column. I figured I'd have to use dynamic SQL but am getting some errors when I execute the function. It compiles fine. Below is the code
CREATE OR REPLACE FUNCTION CopyInfo()
RETURN VARCHAR2 AS
name VARCHAR22(30);
target_schema VARCHAR2(30);
ret_str CHAR := NULL;
BEGIN
SELECT schema INTO target_schema FROM version;
SELECT ename INTO name FROM scott.emp WHERE empno = 7902;
DECLARE
sqlStmt VARCHAR2(1028);
BEGIN
sqlStmt := 'INSERT INTO ' || target_schema || '.emp VALUES( name )';
execute SqlStmt ;
END;
ret_str := 't';
RETURN ret_str;
END CopyInfo
When I create the function, it comes back with -
Function created.
when I try to execute I get an error as shown below:
SQL>BEGIN
2 DBMS_OUTPUT.PUT_LINE( CopyInfo());
3 END;
4 /
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "SCOTT.COPYINFO", line 13
ORA-06512: at line 2
Any idea, how to fix this ??? Thanks a lot....---Sorry I meant userinfo not version in the code----
I have the following scenario:
User Scott has two tables named USERINFO and EMP with the following description:
desc USERINFO
schema varchar2(30)
desc EMP
ename varchar2(30)
empno number(4)
User Blake has one table named EMP which looks like:
desc EMP
ename varchar2(30)
I want to write a function which would copy the values from Scott's EMP table to Blake's EMP table but I want to get the user Blake's name from USERINFO's schema column. I figured I'd have to use dynamic SQL but am getting some errors when I execute the function. It compiles fine. Below is the code
CREATE OR REPLACE FUNCTION CopyInfo()
RETURN VARCHAR2 AS
name VARCHAR22(30);
target_schema VARCHAR2(30);
ret_str CHAR := NULL;
BEGIN
SELECT schema INTO target_schema FROM userinfo;
SELECT ename INTO name FROM scott.emp WHERE empno = 7902;
DECLARE
sqlStmt VARCHAR2(1028);
BEGIN
sqlStmt := 'INSERT INTO ' || target_schema || '.emp VALUES( name )';
execute SqlStmt ;
END;
ret_str := 't';
RETURN ret_str;
END CopyInfo
When I create the function, it comes back with -
Function created.
when I try to execute I get an error as shown below:
SQL>BEGIN
2 DBMS_OUTPUT.PUT_LINE( CopyInfo());
3 END;
4 /
ERROR at line 1:
ORA-00984: column not allowed here
ORA-06512: at "SCOTT.COPYINFO", line 13
ORA-06512: at line 2
Any idea, how to fix this ??? Thanks a lot.... -
Dynamic SQL and Data with Single Quotes in it.
Hi There,
I have a problem in that I am using dynamic SQL and it happens that one of the columns does contain single quotes (') in it as part of the data. This causes the resultant dynamic SQL to get confused as the single quote that is part of the data is taken to mean end of sting, when in fact its part of the data. This leaves out a dangling single quote that was meant to enclose the string. Here is my dynamic SQL and the result of the parsed SQL that I have captured:
****Dynamic SQL*****
l_sql:='select NOTE_TEMPLATE_ID '||
'FROM TMP_NOTE_TEMPLATE_VALUES '||
'where TRIM(LEGACY_NOTE_CODE)='''||trim(fp_note_code)||''' '||
'and TRIM(DISPLAY_VALUE)='''||trim(fp_note_text)||''' ';
execute immediate l_sql INTO l_note_template_id;
Because the column DISPLAY_VALUE contains data with single quotes, the resultant SQL is:
******PARSED SQL************
select NOTE_TEMPLATE_ID
FROM TMP_NOTE_TEMPLATE_VALUES
where TRIM(LEGACY_NOTE_CODE)='INQ' and TRIM(DISPLAY_VALUE)='Cont'd'
And the problem lies with the single quote between teh characters t and d in the data field for DISPLAY_ITEM. How can I handle this?
Many thanks,I have been reliably informed that if one doesn't enclose char/varchar2 data items in quotes, the right indices may not be usedI am into oracle for past 4 years and for the first time i am hearing this.
Your reliable source is just wrong. Bind variables are variables that store your value and which are used in SQL. They are the proper way to use values in your SQL. By default all variables in PL/SQL is bind variable.
When you can do some thing in just straight SQL just do it. Dynamic SQL does not make any sense to me here.
Thanks,
Karthick.
Maybe you are looking for
-
HELP!!! How do I get rid of RIM Network Spam
I get 50 of these a day. I have tried to filter it on my Curve 8330, I blocked sender on my outlook emails and on my comcast webmail I reported as spam and it keeps coming. I recently change me email address and it found me again. I uninstalled bl
-
Why does the fire fox page change, sometimes it is just an orange fire fox button on the top left that opens a panel with all the things listed in it and then it sometimes has a bar across the top that says File, Edit, View, History, bookmarks, tools
-
Hello Every1, When I try to process the CIF inbound queue (APO system) it says the logical system is not found. But when I check in the table TRFCQIN and TRFCQSTATE the logical system has assigned properly. So please let me know how to rectify
-
Captivate 4 not exporting to Flash CS4 correctly
When I export from Captivate 4 to Flash CS4 it doesn't place the imported objects on their own timeline. Instead, it places each object into a movie symbol, which has its own timeline. The problem is that when I save it as a .swf in Flash and then I
-
Help with program flow and timing a loop please
I'm working on an application that will display vibration data on several tabs. 1 tab displays the time waveform, another a running RMS value, another an FFT etc. On another tab I want the user to have the option of streaming the data to disk for 'x