PL/SQl with Decode
Hi,
I have a PL/SQL Procedure to insert a new record into a table !
So I use the decode function, because I don't want to
program the logic in the application.
Is it a good solution
Thanks
marcel
Its a bit vague but overall yes it is a good design to use stored procedures to manipulate the data and kkep the logic in the database.
As well as separation of skills, maintenance, and support for multiple front end environments you get good security too as you do not need to give write access to tables, just execute on procedures. This will avoid all those "How can I stop people connecting to the database using <such and such> application?" questions.
Similar Messages
-
Use sql function decode with Zend code
Hi,
I need to use sql function DECODE() in a query for PHP Code. This query works well in sql*plus but PHP returns
the following error message:
Parse error: syntax error, unexpected T_STRING in C:\Program Files\Zend\Apache2\htdocs\Compta\compta2.php on line 16
the query is :
$query =
'select substr(c.NUM,1 ,2) Compte ,
c.designation , a.Periode
,decode(substr(c.NUM,1 ,1), '1',1, '2',1,'3',1,-1) cp_type ,
sum(credit) - sum(debit) Montant
from ecritures a, clients b, compte c
where
b.NUM (+) =a.NUM
and a.DATEECRITURE between to_date(:debut, \'dd/mm/yy\') and to_date(:fin, \'dd/mm/yy\')
and substr(a.num,1,2) =c.num
group by substr(c.NUM,1 ,1), substr(c.NUM,1,2) , c.designation ,a.periode
order by compte ';
Can any one help me ???
Thanks by advance
nb: Iuse Zend 2.0Hi,
You need to escape single quote mark:
decode(substr(c.NUM,1 ,1), \'1\',1, \'2\',1,\'3\',1,-1) cp_type ,
the same way you did for to_date:
to_date(:debut, \'dd/mm/yy\')
Regards,
Paweł -
How to get the required output with single query to acheive IF SAL>2500 and job='manager' then display job as 'seniormanager'.
CREATE TABLE EMP(EMPNO NUMBER(4) NOT NULL,ENAME VARCHAR2(10),JOB VARCHAR2(9),MGR NUMBER(4),HIREDATE DATE,SAL NUMBER(7, 2),COMM NUMBER(7, 2),DEPTNO NUMBER(2));
INSERT INTO EMP VALUES(7521, 'WARD', 'SALESMAN', 7698,TO_DATE('22-FEB-1981', 'DD-MON-YYYY'), 1250, 500, 30);
INSERT INTO EMP VALUES(7566, 'JONES', 'MANAGER', 7839,TO_DATE('2-APR-1981', 'DD-MON-YYYY'), 2975, NULL, 20);
INSERT INTO EMP VALUES(7698, 'BLAKE', 'MANAGER', 7839,TO_DATE('1-MAY-1981', 'DD-MON-YYYY'), 2850, NULL, 30);
INSERT INTO EMP VALUES(7782, 'CLARK', 'MANAGER', 7839,TO_DATE('9-JUN-1981', 'DD-MON-YYYY'), 2450, NULL, 10);
INSERT INTO EMP VALUES(7788, 'SCOTT', 'ANALYST', 7566,TO_DATE('09-DEC-1982', 'DD-MON-YYYY'), 3000, NULL, 20);
IF SAL>2500 and job='manager' then display job as 'seniormanager'
SELECT * FROM EMP
expected output
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES SENIORMANAGER 7839 02-APR-81 2975 20
7698 BLAKE SENIORMANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20Hi,
The answer to "How do I ... using DECODE?", no matter how you fill in the blank, is "Don't use DECODE; use CASE instead." If you have to ask, then it's too complicated to do with DECODE.
Here's one way using CASE:
SELECT empno, ename
, CASE
WHEN job = 'MANAGER'
AND sal > 2500
THEN 'SENIORMANAGER'
ELSE job
END AS d_job
, mgr, hiredate, sal, comm, deptno
FROM emp
;If you really, really, really want to use DECODE:
SELECT empno, ename
, DECODE ( job
, 'MANAGER'
, DECODE ( SIGN (sal - 2500)
, 1
, 'SENIORMANAGER'
, job
, job
) AS d_job
, mgr, hiredate, sal, comm, deptno
FROM emp
;Nothing is literally too difficult to do in DECODE. Anything that case be done with CASE can also be done using DECODE, often using several times the amount of code. Bit which would you rther maintain: the CASE soltuion I posted first, of this DECODE soltuion. Which do you think will have more bugs? Which so you think will be faster? If you're using Oracle 8.1 (or higher) then don't use inefficient, high-maintenance code like this. Use CASE instead.
Edited by: Frank Kulash on Dec 26, 2012 3:27 PM
Added DECODE solution -
Error while replacing IF statements with DECODE function in procedure
Hi All,
I have created a procedure which has nested IF statements. Now I want to replace the IF statements with DECODE functions to improve performance.
Procedure:
IF (var_int_sev = '0')
THEN
var_sev := '2';
ELSE
SELECT sev
INTO var_int_sev
FROM errorconfig
WHERE errorcode = var_errorcode;
var_sev := var_int_sev;
END IF;
I converted the above IF statement into DECODE function as mentioned below:
var_Sev := DECODE(var_int_sev,0,2,SELECT severity FROM errorconfig WHERE errorcode=var_ErrorCode)
But it throws below error at the select statement used inside DECODE.
Error(58,51): PLS-00103: Encountered the symbol "SELECT" when expecting one of the following: ( - + case mod new not null others <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 alternativ
Can someone help me in converting the IF to DECODE in the above case. Also how can we use a select statement inside decode.instead of trying to rewrite all your code and hoping that the performance will be better, it's a better option to investigate and find out which part of your application is slow
read this:
When your query takes too long ... -
it is possible to write something approaching an if..then..else statement in SQL with 'generalized' conditions in the if statement.
Attached is the query for the payment register, in which I've written a series of decode statements, one for each possible value of the payment code. The query works OK - however, its specific and as the number of paycodes expand (and they do), the report won't pick up the new paycode until the code is changed. More importantly, the report won't be correct until someone 'discovers' that a paycode is missing, which might take months.
If I were writing the equivalent of this series of decode statements in Focus, it would be something like this:
DEFINE.......
PAYMED/D12.2 = IF PAYMENT_CD LE 18
THEN PAYMENT_AMT
ELSE 0 ;
PAYIND/D12.2 = IF PAYMENT_CD GE 19 AND PAYMENT_CD LE 49
THEN PAYMENT_AMT
ELSE 0 ;
PAYEXP/D12.2 = IF PAYMENT_CD GE 70
THEN PAYMENT_AMT
ELSE 0 ;
PAYREC/D12.2 = IF PAYMENT_CD GE 50 AND PAYMENT_CD LE 69
THEN PAYMENT_AMT
ELSE 0;
END
IN SQL/PLUS:
SELECT ACCOUNT_NAME,
LOCATION_1,
CLMNT_LAST_NAME,
CLAIM_NBR,
DATE_OF_INJURY,
DATE_CHECK_REGISTER,
PAYEE_NAME_1,
PAYMENT_CD,
SERV_OFC,
CPO_CHECK_NBR,
PAYMENT_FORM,
DECODE(PAYMENT_CD, 20, PAYMENT_AMT, 21, PAYMENT_AMT,
22, PAYMENT_AMT, 23, PAYMENT_AMT, 25, PAYMENT_AMT,
26, PAYMENT_AMT, 27, PAYMENT_AMT, 28, PAYMENT_AMT,
29, PAYMENT_AMT, 30, PAYMENT_AMT, 31, PAYMENT_AMT,
32, PAYMENT_AMT, 33, PAYMENT_AMT, 34, PAYMENT_AMT,
35, PAYMENT_AMT, 36, PAYMENT_AMT, 37, PAYMENT_AMT,
39, PAYMENT_AMT, 40, PAYMENT_AMT, 41, PAYMENT_AMT,
42, PAYMENT_AMT, 43, PAYMENT_AMT, 44, PAYMENT_AMT,
45, PAYMENT_AMT, 46, PAYMENT_AMT, 47, PAYMENT_AMT,
48, PAYMENT_AMT, 49, PAYMENT_AMT, NULL) INDEMNITY,
DECODE(PAYMENT_CD, 0, PAYMENT_AMT, 1, PAYMENT_AMT,
2, PAYMENT_AMT, 3, PAYMENT_AMT, 4, PAYMENT_AMT,
5, PAYMENT_AMT, 6, PAYMENT_AMT, 7, PAYMENT_AMT,
8, PAYMENT_AMT, 9, PAYMENT_AMT, 10, PAYMENT_AMT,
11, PAYMENT_AMT, 12, PAYMENT_AMT, 13, PAYMENT_AMT,
14, PAYMENT_AMT, 15, PAYMENT_AMT, 18, PAYMENT_AMT,
17, PAYMENT_AMT, NULL) MEDICAL,
DECODE(PAYMENT_CD, 70, PAYMENT_AMT, 71, PAYMENT_AMT,
72, PAYMENT_AMT, 73, PAYMENT_AMT, 74, PAYMENT_AMT,
75, PAYMENT_AMT, 76, PAYMENT_AMT, 77, PAYMENT_AMT,
78, PAYMENT_AMT, 79, PAYMENT_AMT, 80, PAYMENT_AMT,
81, PAYMENT_AMT, 82, PAYMENT_AMT, 83, PAYMENT_AMT,
84, PAYMENT_AMT, 85, PAYMENT_AMT, 86, PAYMENT_AMT,
87, PAYMENT_AMT, 88, PAYMENT_AMT, 89, PAYMENT_AMT,
90, PAYMENT_AMT, NULL) EXPENSES,
DECODE(PAYMENT_CD, 50, PAYMENT_AMT, 51, PAYMENT_AMT,
52, PAYMENT_AMT, 53, PAYMENT_AMT, 54, PAYMENT_AMT,
55, PAYMENT_AMT, 56, PAYMENT_AMT, 57, PAYMENT_AMT,
58, PAYMENT_AMT, NULL) RECOVERIES,
DECODE(PAYMENT_FORM, 'N', PAYMENT_AMT, NULL) NONCASH,
DATE_FROM_SERVICE,
DATE_THRU_SERVICE
FROM &INPUT_TABLES
WHERE &SECURITYCOND
DATE_OF_PAYMENT BETWEEN :START_DATE AND :END_DATE
ORDER BY LOCATION_1, CPO_CHECK_NBR
As you can see, this is both much easier to write and covers the possibility of expansion of paycodes (expansions always fit in these defined ranges).
My question is, then, is it possible to write something like this in SQL and, if so, could you give me some sample code? (I'm one of those people who learn best from looking at the code as opposed to a set of instructions)Here is one way you could do it.
Create a table that has columns like:
Payment_code varchar2(2),
Effective_Date Date,
Payment_type varchar2(20),
Expiration_Date Date)
Payment type for example could be
I- indemnity
M- medical
R- recovery
E- expenses
Let the table name for example be PAYMENT_CODE.
The select query would look like
SELECT ACCOUNT_NAME,
LOCATION_1,
CLMNT_LAST_NAME,
CLAIM_NBR,
DATE_OF_INJURY,
DATE_CHECK_REGISTER,
PAYEE_NAME_1,
PAYMENT_CD,
SERV_OFC,
CPO_CHECK_NBR,
PAYMENT_FORM,
DECODE(p.payment_type,'E',PAYMENT_AMOUNT,0) expenses,
DECODE(p.payment_type,'I',PAYMENT_AMOUNT,0) indemnity,
DECODE(p.payment_type,'M',PAYMENT_AMOUNT,0) Medical,
DECODE(p.payment_type,'R',PAYMENT_AMOUNT,0) recoveries,
DECODE(PAYMENT_FORM, 'N', PAYMENT_AMT, NULL) NONCASH
FROM &INPUT_TABLES,
PAYMENT_CODE P
WHERE P.PAYMENT_CODE = SOMEINPUT_TABLE.PAYMENT_CODE
and other conditions
The idea is to group all the payment codes into a few groups to reduce the clutter. If there is ever a change to the payment code, you could modify the table and it will be reflected in your select query. -
OWB3i - Validate with DECODE function
Hi,
in OWB 3i when I validate an expression defined inside an expression operator with DECODE() function (which is not include in default transformation) come this error:
Line 1, Col 1:
PLS-00204: function or pseudo-column 'DECODE' may be used inside a SQL statement only
but it seems only a warning because when i generate the scripts and run no other error happen and all works fine.
RegardsHi,
Welcome to the forum!
When you use a default value, the last argument to DECODE is the actual value you want as a default.
For example:
SELECT ename
, deptno
, DECODE ( deptno
, 30 , 'Sales'
, 'All others' -- Default value
) AS dname
FROM scott.emp
ORDER BY ename
;Output:
ENAME DEPTNO DNAME
ADAMS 20 All others
ALLEN 30 Sales
BLAKE 30 Sales
CLARK 10 All others
FORD 20 All others
JAMES 30 Sales
JONES 20 All others
KING 10 All others
MARTIN 30 Sales
MILLER 10 All others
SCOTT 20 All others
SMITH 20 All others
TURNER 30 Sales
WARD 30 Sales
I hope this answers your question.
If not, post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) for all tables involved, and also post the results you want from that data.
Explain, using specific examples, how you get those results from that data.
If you can show the problem using commonly available tables (such as those in the scott schema) then you don't need to post any sample data; just the results and the explanation.
Always say which version of Oracle you're using (e.g., 11.2.0.2.0).
See the forum FAQ {message:id=9360002} -
Tuning sql with analytic function
Dear friends I've developed one sql :
with REP as
(select /*+ MATERIALIZE */ branch_code,
row_number() over(partition by branch_code, account order by bkg_date desc ) R,
account,
bkg_date,
lcy_closing_bal
from history t
select REP1.branch_code,
REP1.account,
REP1.bkg_date,
REP1.lcy_closing_bal,
NULL AS second,
REP2.bkg_date bkg_date2,
REP2.lcy_closing_bal lcy_closing_bal2,
NULL AS third,
REP3.bkg_date bkg_date3,
REP3.lcy_closing_bal lcy_closing_bal3
from (SELECT * FROM REP WHERE R=1) REP1, (SELECT * FROM REP WHERE R=2) REP2, (SELECT * FROM REP WHERE R=3) REP3
where
(REP1.BRANCH_CODE = REP2.BRANCH_CODE(+) AND REP1.ACCOUNT = REP2.ACCOUNT(+)) AND
(REP1.BRANCH_CODE = REP3.BRANCH_CODE(+) AND REP1.ACCOUNT = REP3.ACCOUNT(+))The point is I want to restrict (tune) REP before it used ,because , as you can see I need maximum three value from REP (where R=1,R=2,R=3) . Which analytic function and with wich options I have to use to receive only 3 values in each branch_code,account groups at the materializing time ?Radrigez wrote:
Dear friends I've developed one sql :
with REP as
from (SELECT * FROM REP WHERE R=1) REP1,
(SELECT * FROM REP WHERE R=2) REP2,
(SELECT * FROM REP WHERE R=3) REP3
where
(REP1.BRANCH_CODE = REP2.BRANCH_CODE(+) AND REP1.ACCOUNT = REP2.ACCOUNT(+)) AND
(REP1.BRANCH_CODE = REP3.BRANCH_CODE(+) AND REP1.ACCOUNT = REP3.ACCOUNT(+))
The first step is to put your subquery (which doesn't need to be materialized) into an inline view and restrict the result set on r in (1,2,3) as suggested by thtsang - you don't need to query the same result set three times.
Then you're looking at a simple pivot operation (assuming the number of rows you want per branch and account is fixed). If you're on 11g search the manuals for PIVOT, on earlier versions you can do this with a decode() or case() operator.
Step 1 (which could go into another factored subquery) would be something like:
select
branch_code, account,
case r = 1 then bkg_date end bkg_date,
case r = 1 then lcy_closing_bal end lcy_closing_bal,
case r = 2 then bkg_date end bkg_date2,
case r = 2 then lcy_closing_bal end lcy_closing_bal2,
case r = 3 then bkg_date end bkg_date3,
case r = 3 then lcy_closing_bal end lcy_closing_bal3
from
repThis gives you the eight necessary columns, but still (up to) three rows per branch/account.
Then you aggregate this (call it rep1) on branch and account.
select
branch_code, account,
max(bkg_date),
max(lcy_closing_bal),
max(bkg_date2),
max(lcy_closing_bal2),
max(bkg_date3),
max(lcy_closing_bal3)
from
rep1
group by
branch_code, account
order by
branch_code, accountRegards
Jonathan Lewis
http://jonathanlewis.wordpress.com
Author: <b><em>Oracle Core</em></b> -
PL/SQL URL decode function
I am looking for a pl/sql url decode function. Does not appear to be in owa_util or htp/htf. Does any one have one please?
You can use the utl_url package that provides public APIs for both encoding and recoding purposes.
-
Problem with DECODE block in WHERE clause
Hi,
I'm facing problem with DECODE statement. I just simulated my problem in the simple way as follows. If I execute this following query, I should get "hello", but I'm not getting anything (ZERO rows returned).
SELECT 'hello' FROM DUAL
WHERE 'sample1' in (DECODE(1, 1, '''sample1'', ''sample2'', ''sample3''',
2, '''sample4'', ''sample5'', ''sample6'''
I think some problem is there in my WHERE clause.
But When I'm exeucting the following query as a seperate query, then I'm getting the value of DECODE block properly, but didn;t understnad why its not returning the same way when I'm putting the same DECODE statement in WHERE clause.
SELECT DECODE(1, 1, '''sample1'', ''sample2'', ''sample3''',
2, '''sample4'', ''sample5'', ''sample6'''
FROM DUAL;
Please help me to get out of this problem. Thank you so much in advance.
Thanks,
Ramji.The value returned by SELECT DECODE(1, 1, '''sample1'', ''sample2'', ''sample3''',2, '''sample4'', ''sample5'', ''sample6''') FROM DUAL;
'sample1', 'sample2', 'sample3' is a single string. Consider it x.
SELECT 'hello' FROM DUAL WHERE 'sample1' in ( DECODE(1, 1, '''sample1'', ''sample2'', ''sample3''',2, '''sample4'', ''sample5'', ''sample6'''));
is like SELECT 'hello' FROM DUAL WHERE 'sample1' in ('x');
or
SELECT 'hello' FROM DUAL WHERE 'sample1' in ('''sample1'', ''sample2'', ''sample3''') and not
SELECT 'hello' FROM DUAL WHERE 'sample1' in ('sample1', 'sample2', 'sample3');
For this same reason SELECT 'hello' FROM DUAL WHERE 'sample1' in (select '''sample1'', ''sample2'', ''sample3''' from dual);
also does'nt work.
Please use INSTR to find whether 'sample1' exists in the string 'sample1', 'sample2', 'sample3'. -
Hello,
i have question regarding PL/SQL using DECODE when i use following qurey in SQL plus it is working fine but when i try to run in tode it only display value of g.
everything else is blank........
so can u plz assist me on that .....
thanks in advance!!!!!!!!!!
SELECT
b.g,b.s,
COUNT(DECODE(a.u,'R',a.rep)) AS R,
COUNT(DECODE(a.u,'u',a.rep)) AS U,
COUNT(DECODE(a.u,'C',a.rep))AS C,
COUNT(DECODE(a.u,'I',a.rep)) AS I,
COUNT(DECODE(a.u,NULL,a.rep)) AS B
FROM AREA a, data b
WHERE a.rep = '454637'
AND a.rep = b.emp
GROUP BY b.g,b.sVery strange.
Find out if there are alterations to your SQL*PLUS envirionment. Warren mentioned user/database wierdness; the ALTER SCHEMA and other commands can affect privilges and what objects you can see. Sometimes these commands are buried in LOGIN.SQL and GLOGIN.SQL files (for SQL*PLUS), and more hard to find they can call files buried on a network somewhere.
Try the query without the DECODE() and see what's in the table without trying to modify the values in both envirionments. -
Problem in SQL with CURSOR( ) ,Why the CURSOR did not work?
hi All:
I have a problem in SQL with CURSOR.
The data is as the attachments.
Here is the SQL statement as follow:
SELECT A.WADCTO,A.WADOCO,B.IGCOST,CURSOR (SELECT X.IGLITM
FROM F3102 X
WHERE X.IGDOCO=A.WADOCO
AND X.IGCOST IN ('B1','D1','C3')) AS DETAIL
FROM F4801 A INNER JOIN F3102 B ON A.WADOCO=B.IGDOCO AND A.WADCTO=B.IGDCTO AND B.IGCOST>' '
WHERE A.WADOCO='10004'
The statement above returns records as follow:
WADC WADOCO IGCOST DETAIL
WO 10004 A1 CURSOR STATEMENT : 4
CURSOR STATEMENT : 4
IGLITM
1KV90CPG2
1KV90CPG2
1KV90CPG2
But, after I add one statement in the subquery, there is no record returned from CURSOR.
Here is the SQL statement:
SELECT A.WADCTO,A.WADOCO,B.IGCOST,CURSOR (SELECT X.IGLITM
FROM F3102 X
WHERE X.IGDOCO=A.WADOCO
AND X.IGCOST=B.IGCOST
AND X.IGCOST IN ('B1','D1','C3')) AS DETAIL
FROM F4801 A INNER JOIN F3102 B ON A.WADOCO=B.IGDOCO AND A.WADCTO=B.IGDCTO AND B.IGCOST>' '
WHERE A.WADOCO='10004'
The statement above returns records as follow:
WADC WADOCO IGCOST DETAIL
WO 10004 A1 CURSOR STATEMENT : 4
CURSOR STATEMENT : 4
no rows selected
Why the CURSOR did not work?
The database version is Oracle Database 10g Release 10.2.0.4.0 - 64bit Production.
F3102 DATA:
IGDOCO IGDCTO IGLITM IGCOST
10004 WO 1KV90CPG2 A1
10004 WO 1KV90CPG2 B1
10004 WO 1KV90CPG2 C3
10004 WO 1KV90CPG2 D1
F4801 DATA:
WADCTO WADOCO
WO 10004
Edited by: user2319139 on 2010/3/2 上午 1:17
Edited by: user2319139 on 2010/3/2 上午 1:20Why this structure and not a join?
The cursor() function returns a cursor handle that needs to be processed - in other words, the client needs to fetch data from it. The Oracle® Database SQL Reference+ (http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/expressions005.htm#i1035107) describes it as being equivalent to a ref cursor handle.
Thus why are you creating ref cursor handles as a column in a SQL projection - where each row will have a "+nested+" ref cursor handle to process. What problem are you attempting to hack solve this way? -
Problems with decoding an latin1-encoded url
Hi,
i have a problem with decoding german umlaut-characters from an URL.
I'm using Tomcat 5.5 on a Linux server and one on a windows machine for development. Both webapps have the same configurations.
A servlet decodes the URL-String, parses it and stores the parsed data into a mysql-DB.
For decoding the query-string i'm using org.apache.commons.codec.net.URLCodec.URLCodec.decode .
Here's the code:
String unparsedParameters = request.getQueryString();
URLCodec codec = new URLCodec("ISO-8859-1");
result = codec.decode(unparsedParameters);Here an example for a query-string: http://servername:8080/servlet/Import?Etwas%20wurde%20am%2025.08.2010%2010%3A16%3A50%20*ge%E4ndert*
On the windows machine the word "*geändert*" is decoded correctly. But on the linux server i get "*ge?ndert*". It makes no difference if i write the result into the database or just into a logfile.
Can anyone help?
Thanks in advance.
Edited by: sol1640 on Aug 26, 2010 5:59 AMProblem resolved.
Instead of using the decode-method as described in my fist message now i'm doing the folowing:
fURLDecodigCharset = "ISO8859-1";
byte[] bytes = originalParam.getBytes(fURLDecodigCharset);
byte[] decodeUrl = URLCodec.decodeUrl(bytes);
result = new String (decodeUrl, fURLDecodigCharset);because the method "decode" decodes the string by using the defaultcharset. And that was the problem.
>
The default charset is determined during virtual-machine startup and typically depends upon the locale and charset of the underlying operating system.
>
Thats why i've got different behaviours on different systems.
Thanks -
How to reduce different versions of SQL with bind variables
There is an application, developed on Java.
Application executes SQL following types:
select * from t where id in (:1)
select * from t where id in (:1, :2)
select * from t where id in (:1, :2, :3)
select * from t where id in (:1, :2, :3, :4)
...And as a result very many versions (thousands) of similar SQL.
Do you know a method to reduce number of such SQLs?
I see one method: use one form of SQL with large number of prepared bid variables.
Like as
select * from t where id in (:1, :2, :3, :4, :5, :6, :7, :8, ...);And if query will be executed with one variable, the others will be equal to null.
Is there another method?Cannot you insert those values into a temporary table and work within a subquery against that table ? That will make the code more secure, especially if the number of values is high.
Nicolas. -
Problem with DECODE statement while migrating forms to 6i
Hi,
I'm migrating a form from 5 to 6i. When I compiled the form, I got this error witha decode statement.
The error is
Error 307 at line 15 column 7
too many declarations of "DECODE" match this call
The trigger has this code:
IF :PRUN_RECS_INSERTED = 'Y' THEN
RETURN ;
END IF ;
INSERT INTO GJBPRUN
( GJBPRUN_JOB,
GJBPRUN_ONE_UP_NO,
GJBPRUN_NUMBER,
GJBPRUN_ACTIVITY_DATE,
GJBPRUN_VALUE )
SELECT :KEYBLCK_JOB,
:ONE_UP_NO,
GJBPDFT_NUMBER,
SYSDATE,
DECODE(GJBPDFT_VALUE, 'SYSDATE',
DECODE(GJBPDEF_LENGTH,'11',TO_CHAR(SYSDATE,'DD-MON-YYYY'), SYSDATE),
GJBPDFT_VALUE)
FROM GJBPDFT G, GJBPDEFEdited by: Charan on Mar 16, 2011 9:15 AMHi Charan
i think it's all about using both CHARACTER and DATE values at the same time in a DECODE statment u should either use char or date datatype.
DECODE compares expr to each search value one by one. If expr is equal to a search, then Oracle Database returns the corresponding result. If no match is found, then Oracle returns default. If default is omitted, then Oracle returns null.
e.g.
If expr and search are character data, then Oracle compares them using nonpadded comparison semantics.
expr, search, and result can be any of the datatypes CHAR, VARCHAR2, NCHAR, or NVARCHAR2.
The string returned is of VARCHAR2 datatype and is in the same character set as the first result parameter.
for more pls have a look here
Hope this helps,
Regards,
Abdetu... -
Problem with decode!!!
Hi guys,
I have a problem with "decode"!
How can I tell the decode expression
that if a rowset don't exists --> then doing something.
I've tried that with "NULL" but that don't works.
here my code:
I wanted that if tx.text doesn't exists then
it returns fs.anlageschwerpunkt_lang, and otherwise
it returns tx.Text.
select
decode(tx.Text,NULL,fs.anlageschwerpunkt_lang,tx.Text) Anlageschwerpunkt_1 from
POI.Fondsstamm fs,
Texte tx,
Texttypstamm txy
where
tx.match='amfcomm'
and tx.match=rtrim(fs.match)
and tx.TEXTTYPID=txy.TEXTTYPID
and txy.BEREICHSID=14
and txy.texttyp='Marketingstrategie'
I hope somebody of you can help me
thanxx
SchoeibI read Schoeibs question differently; no ROWS are being returned. In that case you cannot expect DECODE or any other function to do anything. Assuming that rows always exist in fs and txy and are only missing in tx, then you need an outer join. Note that the join of tx.match = rtrim(fs.match) has been altered to avoid outer joining to more than one table. As mentioned before, although the decode is OK, NVL could be used instead.
select
decode(tx.Text,NULL,fs.anlageschwerpunkt_lang,tx.Text) Anlageschwerpunkt_1 from
POI.Fondsstamm fs,
Texte tx,
Texttypstamm txy
where
tx.match(+)='amfcomm'
and rtrim(fs.match) = 'amfcomm'
and tx.TEXTTYPID(+)=txy.TEXTTYPID
and txy.BEREICHSID=14
and txy.texttyp='Marketingstrategie'
Maybe you are looking for
-
How do I change the color of font in a fillable form in Adobe Reader? How can I check if the writer of the document has given permission to edit color and not just add text? Please help! I'm technologically challenged.
-
No low battery alarm when on the call. (Nokia 700)
There must be some bug with the low battery alarm on Nokia 700. When the phone is on a long call, it just shuts down without any alarm at all. I had this issue several times. My battery shows that it's full for about 30% or something. Then I call and
-
I have a requirement to have a-z in a spinner? Any ideas if this can be accomplished in ADF? -Srini.
-
Can't see 5th gen nano on hp pavillion running windows xp
Hi guys, I just got a brand new 5th gen nano (for my birthday) but when i connect it to the usb port on my pc the error message usb device not recognised comes up and i've tried all the usual ways to remidy this (the 5 R's etc). Also, when i check th
-
Hi, I have completed OCA ,Please tell me how to get OCA logo to put on my resume.