Passing regular expression backreference to SQL function
Does anyone know if it is possible to pass a regular expression backreference to an SQL function?
When I try this:
SELECT REGEXP_REPLACE('/abc/23468/xyz1/10/', '(/)([[:digit:]]+)', '\1'||LENGTH('\2')) FROM dual;
I am getting this back:
/abc/2/xyz1/2/
Here LENGTH function takes backreference '\2' literally as a string and does not replace it with the actual value.
Hence, it always returns length of 2 instead of the correct value.
However, if do this
SELECT REGEXP_REPLACE('/abc/23468/xyz1/10/', '(/)([[:digit:]]+)', '\1'||SUBSTR('\2',0)) FROM dual;
I get the right result back
/abc/23468/xyz1/10/
So, SUBSTR works correctly.
Why do LENGTH and SUBSTR handle backreference diffrently?
I am using Oracle 10.2.
Appreciate any help on this.
How about this?
CREATE OR REPLACE FUNCTION fmt_string(
p_Source IN VARCHAR2,
P_Delim IN VARCHAR2 DEFAULT '/'
) RETURN VARCHAR2
IS
v_Start PLS_INTEGER;
v_Pos PLS_INTEGER;
v_Len PLS_INTEGER;
v_String VARCHAR2(4000);
v_Result VARCHAR2(4000);
BEGIN
v_Len := LENGTH(p_Source);
v_Start := 1;
WHILE v_Start <= LENGTH(p_Source)
LOOP
v_Pos := INSTR(p_Source, p_Delim, v_Start);
IF v_Pos = 0 THEN
v_Pos := v_Len;
END IF;
v_String := SUBSTR(p_Source, v_Start, v_Pos - v_Start);
IF REGEXP_LIKE(v_String, '^[0-9]+$') THEN
v_String := TO_CHAR(TO_NUMBER(v_String), 'fm0000000000');
END IF;
v_Result := v_Result || v_string || p_Delim;
v_Start := v_Pos + 1;
END LOOP;
RETURN v_Result;
END fmt_string;
/using it this way:
SELECT fmt_string('/abc/23468/xyz1/10/')
FROM dual;You could put that function also into a PACKAGE.
C.
Similar Messages
-
Regular Expression and PL/SQL help
I am using Oracle 9i, does 9i support regular expression? What functions are there?
My problem is the birth_date column in my database comes from teleform ( a scan program that reads what people wrote on paper), so the format is all jacked up.... 50% of them are 01/01/1981, 10% are 5/14/1995, 10% are 12/5/1993, 10% are 1/1/1983, 10% are 24-JUL-98. I have never really used regular expression and pl/sql, can anybody help me convert all of them to 01/01/1998?
Does Oralce 9i support regular expression? What can I do if oralce 9i does not support regular expression? Thank you very much in advance.9i doesn't support regular expressions (at least not in the 10g regular expressions sense. There is an OWA_PATTERN_MATCH package that has some facilities for regular expressions). But it doesn't look like this is a regular expressions problem.
Instead, this is probably a case where you need to
- enumerate the format masks you want to try
- determine the order you want to try them
- write a small function that tries each format mask in succession until one matches.
Of course, there is no guarantee that you'll ever be able to convert the data to the date that the user intended because some values will be ambiguous. For example, 01/02/03 could mean Feb 1, 2003 or Jan 2, 2003 or Feb 3, 2001 depending on the person who entered the data.
Assuming you can define the order, your function would just try each format mask in turn until one generated a valid date, i.e.
BEGIN
BEGIN
l_date := TO_DATE( p_string_value, format_mask_1 );
RETURN l_date;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
BEGIN
l_date := TO_DATE( p_string_value, format_mask_2 );
RETURN l_date;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
BEGIN
l_date := TO_DATE( p_string_value, format_mask_3 );
RETURN l_date;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
BEGIN
l_date := TO_DATE( p_string_value, format_mask_N );
RETURN l_date;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
RETURN NULL;
END;Justin -
SQL, PL/SQL Expression and PL/SQL function
In a Post Calculation Computation field I wanted the following computation:
if B is X
then
field = A
else
field = B
end if;
or as a decode
Decode(B,X,A,B)
I could not get this to work so I wrote a database function that simulates the decode. So when I put:
My_decode(B,X,A,B)
in the field it did work.
Basically I am not sure what kind of code one is expected to put into SQL, PL/SQL Expression and PL/SQL function fields. Can someone give an example of each? Also the APEX help is sometimes incorrect.
For example if you click the "Post Calculation Computation" label it says:
The For example, if this item is named P1_X, you could use post calculation expressions such as UPPER(:P1_X), INITCAP(:P2_Y), MIN(:P1_X,:P2_Y-200), NVL(:P1_X,:P2_Y), or a function call such as return my_func(:P1_X); to set the final value of the item.
But if you put return my_func(:P1_X); in the field you get an error. It should be just my_func(:P1_X);
thanks ReneDECODE is only available in SQL, so would have to be used in a SQL Expression.Yes, that's what APEX keeps telling me when I use in in a field that has "SQL or PL/SQL expression" above it. So what do you put in the field?
-
Regular Expression Query for SQL
Hi,
I am working on SQL server and there is a requirement of separating street name and street number.
I tried using regexp_substr but not able to do it perfectly.
Here are some sample names which need cleansing
Full name
street name
street no
Bahnhofplatz 1 / Werkstatt
Bahnhofplatz
1 / Werkstatt
Reinacherstr. 149/151
Reinacherstr.
149/151
Kosuth UCA 7/A
Kosuth UCA
7/A
Route des Jeunes 9 / 6 ème
Route des Jeunes
9 / 6 ème
L'Arcadie / Route de Moudon
L'Arcadie / Route de Moudon
null
Hofstetten 206
Hofstetten
206
Rgds
Amitabhtry this
DECLARE @test TABLE (address VARCHAR(50))
INSERT INTO @test values ('Bahnhofplatz 1 / Werkstatt')
,('Reinacherstr.149 / 151')
,('Kosuth UCA 7 / A')
,('Moudon')
,('L''Arcadie / Route de')
SELECT
Address,
CASE
WHEN patindex('%[0-9]%',address) = 0 then address else substring(address,0,patindex('%[0-9]%',address)) end col1,
CASE WHEN patindex('%[0-9]%',address) >0 then SUBSTRING(address,patindex('%[0-9]%',address),LEN(address)) end col2
from @test
Address col1
col2
Bahnhofplatz 1 / Werkstatt
Bahnhofplatz 1 / Werkstatt
Reinacherstr.149 / 151
Reinacherstr. 149 / 151
Kosuth UCA 7 / A
Kosuth UCA 7 / A
Moudon Moudon
NULL
L'Arcadie / Route de
L'Arcadie / Route de
NULL
--Prashanth -
Passing Multiple Values from a worksheet to PL/SQL function.
Hi All,
Is there any way to pass multiple values selected in a worksheet to a PL/SQL function ?
I will try to explain the scenario:
We have a crosstab report that showing all the customer details, deposit sum of a customer in each date in a date range selected. With the customer details we are showing the Rank of a customer based on the deposit in the latest date selected. Filtering is based on the rank, ie Top50 or Top60 etc.( As I said rank is calculating based on the deposit in the latest date).This is working fine.
Now the new requirement is to : For example, in Top50 report, list all the customers, who were in the Top50 list, in any of the dates selected. We are able to display the daywise rank, but when giving a condition like daywiserank <= 50, the result becomes uncertain. Some blank lines, wrong amounts etc..
As a work around we tried to find out the rank in a PL/SQL function. But the issue there is : we have some multiple value parameters used in the worksheet.
Is there any way to pass multiple values selected in a worksheet to a PL/SQL function ?
Or any other work arounds for the scenario explained?
Reagrds,
JeneeshHi Russ,
Thanks for the response.
Russ Proudman wrote:
1. I thought there was an analytical function similar to rank - or maybe an option of rank - that if there are duplicate records to have them all considered the same rank. So if you had 3 records all the same as rank=2 then a condition saying where rank=2 would return the 3 records. You could check into this.
We are already using DENSE_RANK. But the issue is the output contains incorrect null values nd repeated rows.
We got it solved as I explained in the previous post. But will that AGGREGATION MODE setting ( Which discoverer says - not recommended) have any issue? I mean side effects?
Russ Proudman wrote:
2. Another thought is that you can create a PL/SQL routine - that's called from a SQL function registered in Discoverer - where a table is created that does the first part of your query. Then a worksheet is created to use the data from that table. So, in essence, the table would have your top50 ranked customers. Then you can write any kind of worksheet against that table. However, DBAs are loath to allow tables - that they didn't create! - many times in a PROD environment.
Here also the same problem will occur: as the top 50 will depend upon the parameters. I cannot pass those parameters to PL/SQL Function.And storing the top50 ( itmay be top100 or to 150 also) for all combinations of the parameters is impossible
Russ Proudman wrote:
3. Finally, are you sure you're rank function is correct in that if you're getting blank lines, maybe the 'over' part is not considering all columns needed to determine the rank?
Yes the query we are using is correct. The output QUERY of discoverer gives correct results in Sqlplus.
Regards,
Jeneesh -
Passing arrays through multiple PL/SQL procedures and functions
I am maintaining a large PL/SQL application. There is a main procedure that is initially called which subsequently passes information to other PL/SQL functions and procedures. In the end an error code and string is passed to PUT_LINE so it can be displayed. What I would like to be able to do is have an array that stores an error code and string for each error that it comes upon during going through each of the procedures and functions. This would involve passing these codes and strings from function to function within the pl/sql application. What would be the best way to implement this and is it possible to pass arrrays or records to other PL/SQL functions? Thanks.
Here is one simulation ->
satyaki>
satyaki>select * from v$version;
BANNER
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
Elapsed: 00:00:00.20
satyaki>
satyaki>
satyaki>create or replace type n_array is table of number;
2 /
Type created.
Elapsed: 00:00:07.10
satyaki>
satyaki>CREATE OR REPLACE PROCEDURE Get_Array(array_in IN n_array,
2 array_out OUT n_array)
3 IS
4 BEGIN
5 array_out := n_array();
6 FOR i IN 1..array_in.count
7 LOOP
8 array_out.extend;
9 array_out(i) := array_in(i) * 2;
10 END LOOP;
11 END Get_Array;
12 /
Procedure created.
Elapsed: 00:00:00.89
satyaki>
satyaki>
satyaki>Create or Replace Procedure Set_Array(myArray IN n_array)
2 is
3 i number(10);
4 rec emp%rowtype;
5 w n_array:=n_array(1200,3200);
6 bucket n_array := n_array();
7 Begin
8 Get_Array(w,bucket);
9
10 for i in 1..myArray.count
11 loop
12 select *
13 into rec
14 from emp
15 where empno = myArray(i);
16 dbms_output.put_line('Employee No:'||rec.empno||' Name:'||rec.ename);
17 for j in 1..bucket.count
18 loop
19 dbms_output.put_line('Commission Sub Type: '||bucket(j));
20 end loop;
21 end loop;
22 End Set_Array;
23 /
Procedure created.
Elapsed: 00:00:01.33
satyaki>
satyaki>
satyaki>select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
9999 SATYAKI SLS 7698 02-NOV-08 55000 3455 10
7777 SOURAV SLS 14-SEP-08 45000 3400 10
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 4450 10
7788 SCOTT ANALYST 7566 19-APR-87 3000 20
7839 KING PRESIDENT 17-NOV-81 7000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 23-MAY-87 1100 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
13 rows selected.
Elapsed: 00:00:00.28
satyaki>
satyaki>declare
2 v n_array:=n_array(9999,7777);
3 begin
4 Set_Array(v);
5 end;
6 /
Employee No:9999 Name:SATYAKI
Commission Sub Type: 2400
Commission Sub Type: 6400
Employee No:7777 Name:SOURAV
Commission Sub Type: 2400
Commission Sub Type: 6400
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.15
satyaki>
satyaki>Regards.
Satyaki De. -
One for the Tekkies: How to get this output using REGULAR EXPRESSIONS?
How to get the below output using REGULAR EXPRESSIONS??
SQL> ed
Wrote file afiedt.buf
1* CREATE TABLE cus___addresses (full_address VARCHAR2(200 BYTE))
SQL> /
Table created.
SQL> PROMPT Address Format is: House #/Housename, street, City, Zip Code, COUNTRY
House #/Housename, street, City, Zip Code, COUNTRY
SQL> INSERT INTO cus___addresses VALUES('1, 3rd street, Lansing, MI 49001, USA');
1 row created.
SQL> INSERT INTO cus___addresses VALUES('3B, fifth street, Clinton, OK 74103, USA');
1 row created.
SQL> INSERT INTO cus___addresses VALUES('Rose Villa, Stanton Grove, Murray, TN 37183, USA');
1 row created.
SQL> SELECT * FROM cus___addresses;
FULL_ADDRESS
1, 3rd street, Lansing, MI 49001, USA
3B, fifth street, Clinton, OK 74103, USA
Rose Villa, Stanton Grove, Murray, TN 37183, USA
SQL> The REG EXP query shouLd output the ZIP codes: i.e. 49001, 74103, 37183 in 3 rows.Edited by: user12240205 on Jun 18, 2012 3:19 AMHi,
user12240205 wrote:
... Frank, ʃʃp's method, I understand. But your method, although correct, I find it difficult to understand.
Could you explain how you did this?? What does '.*(\d{5})\D*' and '\1' mean???
Your method is better because it uses only ONE reg expression function. ʃʃp's uses 2.In Oracle 10.2 (I believe) and higher, '\d' is equivalent to '[[:digit:]]', and '\D' is equivalent to '[^[:digit:]]'. I find '\d' and '\D' easier to type, but there's nothing wrong with using '[[:digit:]]' and '[^[:digit:]]'.
'.*' means "0 or more of any character".
'\D*' means "0 or more non-digits".
The whole expression, '.*(\d{5})\D*' means:
a. 0 or more characters (any characters)
b. 5 digits
c. 0 or more non-digits.
'\1' is a Backreference . It means the sub-string that matched the pattern after the 1st '(', up to (but not including) its matching ')'. In this case, that means the sub-string that matched '\d{5}', or b. using the explanation immediately above.
So the entire REGEXP_REPLACE call means "When you see a sub-string consisting of a., follwed immediately by b., followed immedately by c., replace that sub-string with b. alone." -
How to use regular expression to delete a character?
Hello,
I have a query,
select partition_name from dba_tab_partitions where table_owner='xxx'and num_rows <>0 and table_name = 'xxx';
P5
P6
P7
P12
P13
P14
P17
P18
P19
P20
P24
How can I use regular expression in above SQL query to get result without letter 'P', like..
5
6
7
12
13
14
17
18
19
20
24
thank youI find answer...
select regexp_replace(partition_name,'P','')
thanks anyway -
Need help for a more complicated regular expression
Hi everyone,
I got another more complicated one here.
I need to split '+0,+0.00000000E+000, -4.76517000E+001,-4.64744200E+001,-6.18140500E+001,-5.93055600E+001' by ',' into an array without '+0,+0.00000000E+000'.
I am using a regular expression as '[+-]([0-9]+[1-9]+)[E][+]\d' but it failed to, just wondering what is happening there.
Any idea is well appreciated,
Thanks,
+Kunsheng
Message Edited by Kunsheng Chen on 03-05-2009 05:09 PM
Solved!
Go to Solution.
Attachments:
regular.vi 33 KBFirst, don't bother with regular expressions. Use the function Spreadsheet String to Array with a commas as the delimiter, %f as the format string, a 1D array of floats as the array type. Next, delete the first two elements from the results and you're done.
Mike...
Certified Professional Instructor
Certified LabVIEW Architect
LabVIEW Champion
"... after all, He's not a tame lion..."
Be thinking ahead and mark your dance card for NI Week 2015 now: TS 6139 - Object Oriented First Steps -
Regular expressions and backreference
Hello!
I am trying to use backreferences in REGEXP in the PERL-style, where I want to match my regular expression and later refer to the grouped values. I can read that those are referecenced with \1 .. \9, but I simply cant get it to work. Here is an example in PL/SQL:
SELECT REGEXP_SUBSTR(l_users.adresse,'([A-Z]+)\s+(\d+)')
INTO l_dummy_varchar2
FROM dual;
OR I could do things like:
l_dummy_varchar2 := REGEXP_SUBSTR(l_users.adresse,'([A-Z]+)\s+(\d+)');
It seems to work, but I cant figure out how to get the backreferenced value.
I would love to do things like:
dbms_output.put_line('my value ='||\1)
but this doesnt work.
Help is very much appreciated.
Best regards
DannieLikewise you can extract things using the
REGEXP_SUBSTR, but you don't need back
referencing...backreferencing is better than additional function (ltrim) use, and BTW be careful with this "ltrims":
SQL> set serveroutput on
SQL>
SQL> DECLARE
2 v_txt VARCHAR2(100);
3 BEGIN
4 v_txt := ltrim(regexp_substr('HERE IS AN ASCII CHARACTER', 'IS AN [[:alnum:]]*'),'IS AN ');
5 DBMS_OUTPUT.PUT_LINE('Word after IS AN: '||v_txt);
6 END;
7 /
Word after IS AN: CII
PL/SQL procedure successfully completed
SQL>
SQL> DECLARE
2 v_txt VARCHAR2(100);
3 BEGIN
4 v_txt := regexp_replace('HERE IS AN ASCII CHARACTER', 'IS AN ([[:alnum:]]*)|.','\1');
5 DBMS_OUTPUT.PUT_LINE('Word after IS AN: '||v_txt);
6 END;
7 /
Word after IS AN: ASCII
PL/SQL procedure successfully completed
SQL> -----------
VB
http://volder-notes.blogspot.com/ -
How to call a SQL function from an XSL expression
Hi
In R12, in Payroll Deposit adivce/Check writer, We need to sort the earnings tag <AC_Earnings> in to two different categories as regular and other earnings. In the DB and form level of element defintiion we have a DFF which differentiates between the two kinds of earnings. But the seeded XML that is gerneated by the check writer does not have this field.
The seeded template displays all the earnings in one column. How can we achieve this in the template without modifying the seeded XML.
The one approach i have is to write a function and based on the return value sort the data. For this I need to know :
1) How to call a SQL function from an XSL expression that is allowed in BI template.
If anyone ahs faced similar requirements please share your approach.
Thanks
SrimathiThank u..
but i'd seen that link wen i searched in google..
Is it possible without using any 3rd party JARs and all?
and more importantly plz tell me what should be preferred way to call a javascript function?
Do it using addLoadEvent() or Windows.Load etc
OR
Call it thru Xsl? (I donno how to do dis)
Thanks in Advance..
Edited by: ranjjose on Jun 3, 2008 8:21 AM -
Passing #COLUMN_VALUE# as parameter to pl/sql function in column template
Hi all,
I want to color negative amounts in red in sql report using column template.
I created a pl/sql function"isNegativeNum" which returns 1 or -1.
create or replace function isNegativeNum(p_column_value varchar2) return number
as
l_dummy number;
begin
l_dummy := to_number(p_column_value,'999G999G990D00PR');
IF l_dummy < 0
THEN
RETURN 1;
else
return -1;
END IF;
exception
when others then
RETURN -1;
end;Below is column template.
Column Template 1
<td class="t3dataalt" #ALIGNMENT#><p color=red>#COLUMN_VALUE#</p></td>Column Template 1 Condition
isNegativeNum('#COLUMN_VALUE#') = -1The issue is #COLUMN_VALUE# value is not being passed to the function, Insert statement in function reveals p_column_value as a string "#COLUMN_VALUE#". When I try without quotes like isNegativeNum(#COLUMN_VALUE#) = -1, I get below error.
ORA-06550: line 1, column 48: PLS-00103: Encountered the symbol "#" when expecting one of the following: ( ) - + case mod new not null others select table avg count current exists max min prior sql stddev sum variance execute multiset the both leading trailing forall merge year month DAY_ hour minute second timezone_hour timezone_minute timezone_region timezone_abbr time timestamp interval date
Error ERR-1025 Error processing PLSQL expression. isNegativeNum(#COLUMN_VALUE#) = 1
Any help is appreciated.
KishoreHi Kishore,
using #COLUMN_VALUE# would probably not make much sense, because normally a report has multiple columns and not just the numeric column which you want to verify if it's negative. But APEX will fire the template condition for each column, because the report template is a column cell template.
What you can do to make it more generic is to use for example
#CHECK_AMOUNT#
in the template and provide a not displayed column in your SQL statement which contains your value which is named CHECK_AMOUNT. For example:
SELECT NAME
, BALANCE
, BALANCE AS CHECK_AMOUNT
FROM XXX;Because this CHECK_AMOUNT column would be a generic name, you can use this template in all your reports as long as you provide this column.
Thope that helps
Patrick -
Data generation using regular expression in c# for sql server
Hello Everybody,
I am using VS 2013 professional, SQL Server 2012.
I am writing database application in c#. I have a table which stores starttime and endtime of operator
As starting step, I inserted random DateTime into the table.
But i would like hide some Patterns inside the database like it should insert some records that operator2 is absent on every second tuesday in every month in 2014 between 3AM to 4AM.
How do i tell my c# code to insert that Patterns into databse. From some posts I understtod that it may be done by using regular expressions. But i did not find clear example.
Could someone please tell me how to do it?
Thank you so much.I'm not sure what exactly you're referring to, but I think you may be able to accomplish some of what you want by using triggers, constraints, and column defaults. These are database objects that are defined by using DDL, so have a look at the DDL reference
(and other information about these objects) in SQL Server Books Online and see if these will do what you want. T-SQL implements a "pattern-wildcard language" that is not the same as regular expressions.
In addition you can write SQLCLR objects (e.g. triggers and functions) that can use the .NET regular expression library, which is an implementation of the well-known regular expression library. There are a number of examples of SQLCLR/regular expressions
around, a simple web search should suffice.
Hope this helps, Bob -
Regular Expression functions not supported in Interactive report filters ??
I'm using APEX 4.0.2 and I'm trying to create a row filter in an interactive report which uses regexp_instr and regexp_replace functions and I'm getting the message:
Invalid filter expression. regexp_instr
The code runs fine in SQL Workshop
select cytogenetics from z_patient
where regexp_instr(regexp_replace(cytogenetics,'(\,+|\"+|\s)',''),'(^46XX$|^46XY$|^46XX\[..\]$|^46XY\[..\]$)')=1
CYTOGENETICS
"46,XX [20]"
"46,XY[20]"
"46,XX"
"46,XY[20]"
"46,XY[30]"
"46,XY[26]"
"46,XY [33]"
"46,XX[32]
etc...
my filter is just the where clause above i.e.
regexp_instr(regexp_replace(cytogenetics,'(\,+|\"+|\s)',''),'(^46XX$|^46XY$|^46XX\[..\]$|^46XY\[..\]$)')=1
*Are regular expression functions just not supported in interactive report filters?*
thanks in advance
Paul PHi Paul,
regular expression functions are supported in interactive report filters, but it looks like that REGEXP_INSTR hasn't been added as valid command. Only REGEXP_SUBSTR and REGEXP_REPLACE are valid commands for computation expressions and REGEXP_SUBSTR, REGEXP_REPLACE and REGEXP_LIKE for row level filters.
I have filed bug# 12926266 to fix this issue. Sorry for the inconvenience.
Regards
Patrick
My Blog: http://www.inside-oracle-apex.com
APEX 4.0 Plug-Ins: http://apex.oracle.com/plugins
Twitter: http://www.twitter.com/patrickwolf -
Passing regexp_replace backreference to a function; type conversion problem
I am trying to convert some text within my CLOB field to HTML links.
The format of the (part of the link I am having problems with) is:
<link 12>
which I wish to convert to
url_dest
I am trying to pass the backreference \1 (being the number 12 in this case) in regexp_replace to a simple function I have made and when I run it I receive the error:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
I have tested the function on its own with passing a string and it works fine.
I have passed the string from the backreference to the function and back out as the return value and it works fine.
However, when I try to pass the string back reference (a set of digits) to use as the NUMBER ID in my where clause, it always returns this error. I have tried CASTing / TO_NUMBER in every way possible I can think of, using temporary variables etc. and still the same error.
=====
CREATE OR REPLACE
FUNCTION GETLINK (linkid IN CLOB)
RETURN VARCHAR2 AS
linkstring VARCHAR2(4000);
linkchar VARCHAR(4000);
linkint NUMBER;
BEGIN
linkchar := TO_CHAR(linkid);
linkint := TO_NUMBER(linkchar);
SELECT url_dest INTO linkstring FROM TABLE WHERE ID = linkint;
RETURN linkstring;
END;
=====
Offending calling code:
tempcontent := regexp_replace(myClobField, '<link ([[:digit:]]*)>', GETLINK('\1'));
=====
I have tried implicit and explicit type conversions that vary the above function; in parameters as VARCHAR2; etc.; no joy.
Is this a bug within the database, is it by design, or is it just me making a hash of things? I really don't want to have to pull the XML into PHP then run the PHP regex functions with Oracle DB queries to do this!
Many thanks for your assistance.
IngramMany thanks for the reply, but I'm not sure how that would work. I wish to do a global regexp_replace on all instances of '<link> ([[:digit:]]*)>' within my XML document, with the return value from the GETLINK function.
So for instance.
The return value of GETLINK could be in format:
<a href="\1">
so an XML document of:
=====
<doc>
<link 12>Test Link</link>
some content
<link 783>A second Test Link</link>
</doc>
=====
would return as:
=====
<doc>
<a href="12">Test Link</link>
some content
<a href="783">A second Test Link</link>
</doc>
=====
Obviously I would then do the other replacements to fix broken XML with the non matching end tags etc.
TIA
Maybe you are looking for
-
AUTOMATIC CREATION OF REWORK ORDER
Hi Could any solve my problem? Basically i am working in pipe manufacturing unit where we follow discrete manufacturing. I have some pipes that been rejected from certain operation and sent for reworking.Now, i want that "A rework order should be cre
-
SAP BCM 6 +7 // OpenSSL vulnerability "Heartbleed"
Hi All, Information on SAP BCM and Heartbleed: The Heartbleed vulnerability in OpenSSL (CVE-2014-0160) has received a significant amount of attention recently. While the discovered issue is specific to OpenSSL, customers might be wondering whether th
-
I just entered my $100 iTunes card and it said it accepted it and sd my bal was $93.49??? Is there some sort of fee that goes along with it?? I don't get it. I paid $100. I don't want to spend $94 of it... What am I missing?
-
EPM 11.1.2 Shared Services
Hi, Hopefully someone can help me out. I am having trouble setting up users through Shared Services using LDAP. I read it is different with regards to native users, which goes through the relational database. My test connection to LDAP server is succ
-
I can only save 2 pdfs at a time to my iphone5. I save two and when I attempt to save a third it deletes the first pdf. Has anyone experienced the same?