Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit3311e25

Browse files
committed
Doc update from Roberto Mello: improved versions of instr() examples.
1 parente458ebf commit3311e25

File tree

1 file changed

+86
-92
lines changed

1 file changed

+86
-92
lines changed

‎doc/src/sgml/plsql.sgml

Lines changed: 86 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!--
2-
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/plsql.sgml,v 2.24 2001/03/17 18:08:14 petere Exp $
2+
$Header: /cvsroot/pgsql/doc/src/sgml/Attic/plsql.sgml,v 2.25 2001/03/23 22:07:50 tgl Exp $
33
-->
44

55
<chapter id="plpgsql">
@@ -2407,13 +2407,6 @@ WITH (isstrict, iscachable);
24072407
This function should probably be integrated into the core.
24082408
</comment>
24092409

2410-
<para>
2411-
The third function (that takes 4 parameters) is implemented in
2412-
PL/Tcl but I plan on porting it to PL/pgSQL so in case we want to
2413-
include it in OpenACS we don't need to require PL/Tcl. Plus
2414-
PL/pgSQL should be more efficient.
2415-
</para>
2416-
24172410
<programlisting>
24182411
--
24192412
-- instr functions that mimic Oracle's counterpart
@@ -2424,127 +2417,128 @@ WITH (isstrict, iscachable);
24242417
-- not passed, assume 1 (search starts at first character).
24252418
--
24262419
-- by Roberto Mello (rmello@fslc.usu.edu)
2420+
-- modified by Robert Gaszewski (graszew@poland.com)
24272421
-- Licensed under the GPL v2 or later.
24282422
--
24292423

2430-
DROP FUNCTION instr(varchar,varchar);
2431-
CREATE FUNCTION instr(varchar,varchar) RETURNS integer AS '
2424+
DROP FUNCTION instr(varchar,varchar);
2425+
CREATE FUNCTION instr(varchar,varchar) RETURNS integer AS '
24322426
DECLARE
24332427
pos integer;
24342428
BEGIN
2435-
pos:= instr($1,$2,1);
2429+
pos:= instr($1,$2,1);
24362430
RETURN pos;
24372431
END;
2438-
' LANGUAGE 'plpgsql';
2432+
' language 'plpgsql';
2433+
2434+
2435+
DROP FUNCTION instr(varchar,varchar,integer);
2436+
CREATE FUNCTION instr(varchar,varchar,integer) RETURNS integer AS '
2437+
DECLARE
2438+
string ALIAS FOR $1;
2439+
string_to_search ALIAS FOR $2;
2440+
beg_index ALIAS FOR $3;
2441+
pos integer NOT NULL DEFAULT 0;
2442+
temp_str varchar;
2443+
beg integer;
2444+
length integer;
2445+
ss_length integer;
2446+
BEGIN
2447+
IF beg_index > 0 THEN
2448+
2449+
temp_str := substring(string FROM beg_index);
2450+
pos := position(string_to_search IN temp_str);
2451+
2452+
IF pos = 0 THEN
2453+
RETURN 0;
2454+
ELSE
2455+
RETURN pos + beg_index - 1;
2456+
END IF;
2457+
ELSE
2458+
ss_length := char_length(string_to_search);
2459+
length := char_length(string);
2460+
beg := length + beg_index - ss_length + 2;
2461+
2462+
WHILE beg > 0 LOOP
2463+
2464+
temp_str := substring(string FROM beg FOR ss_length);
2465+
pos := position(string_to_search IN temp_str);
2466+
2467+
IF pos > 0 THEN
2468+
RETURN beg;
2469+
END IF;
2470+
2471+
beg := beg - 1;
2472+
END LOOP;
2473+
RETURN 0;
2474+
END IF;
2475+
END;
2476+
' language 'plpgsql';
24392477

2440-
DROP FUNCTION instr(varchar, varchar, integer);
2441-
CREATE FUNCTION instr(varchar, varchar, integer) RETURNS integer AS '
2478+
--
2479+
-- Written by Robert Gaszewski (graszew@poland.com)
2480+
-- Licensed under the GPL v2 or later.
2481+
--
2482+
DROP FUNCTION instr(varchar,varchar,integer,integer);
2483+
CREATE FUNCTION instr(varchar,varchar,integer,integer) RETURNS integer AS '
24422484
DECLARE
24432485
string ALIAS FOR $1;
24442486
string_to_search ALIAS FOR $2;
24452487
beg_index ALIAS FOR $3;
2488+
occur_index ALIAS FOR $4;
24462489
pos integer NOT NULL DEFAULT 0;
2447-
ending integer;
2490+
occur_number integer NOT NULL DEFAULT 0;
24482491
temp_str varchar;
24492492
beg integer;
2493+
i integer;
24502494
length integer;
2451-
temp_int integer;
2495+
ss_length integer;
24522496
BEGIN
24532497
IF beg_index > 0 THEN
2454-
-- Get substring from 1 to beg_index
2498+
beg := beg_index;
2499+
temp_str := substring(string FROM beg_index);
24552500

2456-
temp_str := substring(string FROM beg_index);
2457-
pos := position(string_to_search IN temp_str);
2501+
FOR i IN 1..occur_index LOOP
2502+
pos := position(string_to_search IN temp_str);
2503+
2504+
IF i = 1 THEN
2505+
beg := beg + pos - 1;
2506+
ELSE
2507+
beg := beg + pos;
2508+
END IF;
2509+
2510+
temp_str := substring(string FROM beg + 1);
2511+
END LOOP;
24582512

24592513
IF pos = 0 THEN
24602514
RETURN 0;
24612515
ELSE
2462-
RETURNpos + beg_index - 1;
2516+
RETURNbeg;
24632517
END IF;
2464-
24652518
ELSE
2519+
ss_length := char_length(string_to_search);
24662520
length := char_length(string);
2521+
beg := length + beg_index - ss_length + 2;
24672522

2468-
IF beg_index = -1 THEN
2469-
ending := length;
2470-
beg := ending;
2471-
temp_int := 1;
2472-
ELSE
2473-
ending := length - abs(beg_index);
2474-
beg := ending;
2475-
temp_int := ending - beg;
2476-
END IF;
2477-
2478-
WHILE pos = 0 AND beg &lt;&gt; 1 LOOP
2479-
2480-
temp_str := substring(string FROM beg FOR temp_int);
2523+
WHILE beg > 0 LOOP
2524+
temp_str := substring(string FROM beg FOR ss_length);
24812525
pos := position(string_to_search IN temp_str);
24822526

2483-
-- Keep moving left
2527+
IF pos > 0 THEN
2528+
occur_number := occur_number + 1;
2529+
2530+
IF occur_number = occur_index THEN
2531+
RETURN beg;
2532+
END IF;
2533+
END IF;
24842534

24852535
beg := beg - 1;
2486-
temp_int := (ending - beg) + 1;
24872536
END LOOP;
2488-
END IF;
24892537

2490-
IF pos = 0 THEN
24912538
RETURN 0;
2492-
ELSE
2493-
RETURN beg + 1;
24942539
END IF;
24952540
END;
2496-
' LANGUAGE 'plpgsql';
2497-
2498-
--
2499-
-- The next one (where all four params are passed) is in PL/Tcl
2500-
-- because I had no more patience to do it in PL/pgSQL.
2501-
-- It'd probably be faster in PL/pgSQL (that being the reason why
2502-
-- I implemented the first two functions in PL/pgSQL) so someday I'll do it.
2503-
--
2504-
2505-
DROP FUNCTION instr(varchar, varchar, integer, integer);
2506-
CREATE FUNCTION instr(varchar, varchar, integer, integer) RETURNS integer AS '
2507-
set string1 $1
2508-
set string2 $2
2509-
set n $3
2510-
set m $4
2511-
2512-
if { $n > 0 } {
2513-
set pos [string first $string2 $string1 [expr $n -1]]
2514-
if { $pos < 0 } {
2515-
return 0
2516-
} else {
2517-
for { set i 1 } { $i < $m } { incr i } {
2518-
set pos [string first $string2 $string1 [expr $pos + 1]]
2519-
if { $pos < 0 } {
2520-
return 0
2521-
}
2522-
}
2523-
}
2524-
}
2525-
2526-
if { $n < 0 } {
2527-
set pos [string last $string2 $string1 [expr [string length $string1] + $n]]
2528-
2529-
if { $pos < 0 } {
2530-
return 0
2531-
} else {
2532-
for { set i 1 } { $i < $m } { incr i } {
2533-
# n is negative so we add
2534-
set pos [string last $string2 $string1 [expr $pos - 1]]
2535-
if { $pos < 0 } {
2536-
return 0
2537-
}
2538-
}
2539-
}
2540-
}
2541-
2542-
if { $pos < 0 } {
2543-
return 0
2544-
} else {
2545-
return [expr $pos + 1]
2546-
}
2547-
' LANGUAGE 'pltcl';
2541+
' language 'plpgsql';
25482542
</programlisting>
25492543
</sect3>
25502544
</sect2>

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp