简体   繁体   中英

A procedure to Reverse a String in PL/SQL

I just started learning PL/SQL and I'm not sure how to create a procedure. The logic seems about right but I think there's some syntactical mistake in the first line. Here's my code:-

CREATE OR REPLACE PROCEDURE ReverseOf(input IN varchar2(50)) IS
DECLARE 
        reverse varchar2(50);
BEGIN
        FOR i in reverse 1..length(input) LOOP
                reverse := reverse||''||substr(input, i, 1);
        END LOOP;
        dbms_output.put_line(reverse);
END;
/

Two things - you shouldn't specify the datatype size in procedure's/function's parameter list and you do not need the DECLARE keyword. Try this:

CREATE OR REPLACE PROCEDURE ReverseOf(input IN varchar2) IS
        rev varchar2(50):='';
BEGIN
        FOR i in reverse 1..length(input) LOOP
                rev := rev||substr(input, i, 1);
        END LOOP;
        dbms_output.put_line(rev);
END;

Try it without PL/SQL!

WITH
params AS
  (SELECT 'supercalifragilisticexpialidocious' phrase FROM dual),
WordReverse (inpt, outpt) AS
  (SELECT phrase inpt, CAST(NULL AS varchar2(4000)) outpt FROM params
   UNION ALL
   SELECT substr(inpt,2,LENGTH(inpt)-1), substr(inpt,1,1) || outpt
   FROM wordReverse
   WHERE LENGTH(inpt) > 0
  )
SELECT phrase,outpt AS reversed FROM wordReverse, params
WHERE LENGTH(outpt) = LENGTH(phrase) ;

PHRASE                             REVERSED
---------------------------------- -----------------------------------
supercalifragilisticexpialidocious suoicodilaipxecitsiligarfilacrepus

Citation: http://rdbms-insight.com/wp/?p=94

Another solution reverse string minimizing loop count

DECLARE
v_str     VARCHAR2(100) DEFAULT 'MYSTRING';
v_len     NUMBER;
v_left    VARCHAR2(100);
v_right   VARCHAR2(100);
BEGIN
    v_len := LENGTH(v_str)/2;
    FOR rec IN 1..v_len 
    LOOP
      v_left := substr(v_str,rec,1) || v_left;
      IF rec * 2 <= LENGTH(v_str) THEN
        v_right := v_right || substr(v_str,-rec,1);
      END IF;
    END LOOP;
    v_str := v_right || v_left;
    dbms_output.put_line(v_str);
END;
set serveroutput on
declare
  str1 varchar2(30);
  len number(3);
  str2 varchar2(30);
  i number(3);
begin
  str1:='&str1';
  len:=length(str1);
  for i in reverse 1..len
   loop
    str2:=str2 || substr(str1,i,1);
   end loop;
  dbms_output.put_line('Reverse string is: '||str2);
end;
/
    create or replace procedure ap_reverse_number(input_no VARCHAR2) as
      output_no VARCHAR2(100);

    begin

      for i in 1 .. length(input_no) loop
        output_no := output_no || '' ||
                     substr(input_no, (length(input_no) - i + 1), 1);
      end loop;

      dbms_output.put_line('Input no. is :' || input_no);
      dbms_output.put_line('Output no. is:' || output_no);

    end;

This should do the job correctly.

Try this one line statement to reverse the string in sql

with a as (select 'brahma' k from dual)
select listagg(substr(k,length(k)-level+1,1),'') within group (order by 1)  b from a connect by level<length(k)+1
 declare
 name varchar2(20):='&name';
 rname varchar2(20);
 begin
 for i in reverse 1..length(name)
 loop
 rname:=rname||substr(name,i,1);
 end loop;
 display(rname);
 end;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM