0
votes

Insertion de valeurs dans la table à l'aide de la variable

J'ai une chaîne codée 'qjg4mja2dqpcodgymdcncki3nzaxmg =='. J'ai pu le décoder et enregistrer ces valeurs dans une variable et insérer les valeurs dans une table.

My Code: p>

create table demo(column_1 varchar(255));


2 commentaires

Qu'entendez-vous par "3 rangées différentes"? 3 enregistrements dans la table ou un enregistrement avec 3 lignes?


Oui, 3 enregistrements dans le tableau et la longueur de la chaîne dans la variable de sortie n'est pas corrigée. Il peut même être 600, dans ce cas, le nombre d'enregistrements devrait être de 100.


3 Réponses :


1
votes

diviser; substr semble être simple et efficace dans ce cas: xxx


si cela doit être 3 lignes (comme vous l'avez dit ), alors: xxx


4 commentaires

J'ai pensé à Substr. Mais même si la longueur de chaque rangée est de 6. Mais nous ne connaissons pas la longueur de l'entrée, elle peut également être 600. Dans ce cas, comment peut-on faire?


Vous auriez divisé comme vous voulez ; Cependant, comme le dit Roberto, il semble que vous - réellement - ne pas avoir à faire rien . Voir son exemple.


Roberto a utilisé le même code que le même code mais je ne sais pas comment il a obtenu la sortie dans 3 rangées différentes dans la table.


La réponse est que vous avez un chariot de retour de CHR (13) dans la ligne, c'est pourquoi la sortie ressemble à trois rangées, quand en est une. J'ai mis à jour ma réponse originale pour couvrir un moyen de diviser le contenu dans autant de lignes que nécessaire à l'aide de Regexp_substr.



0
votes

Vous n'avez réellement besoin de rien faire. Le fractionnement est le comportement attendu car votre valeur contient le retour de chariot comme un caractère. Vous obtenez une ligne qui contient deux caractères de chr (13), c'est pourquoi il ressemble à 3 lignes lorsque vous en réalité une.

oracle 12.2 p> xxx pré>

Toutefois, si Vous souhaitez obtenir différentes lignes, il vous suffit de scinder à l'aide de la fonction REGEXP_SUBSTR, car le caractère dans ce cas est Chr (13). J'ai modifié votre bloc PL / SQL d'origine pour inclure cette fonctionnalité P>

SQL> select * from demo ;

no rows selected

SQL> declare
output varchar(4000);
counter pls_integer;
v_curr_val varchar(4000);
function to_base64(t in varchar2) return varchar2 is
 begin
 return utl_raw.cast_to_varchar2(utl_encode.base64_encode(utl_raw.cast_to_raw(t)));
 end to_base64;
function from_base64(t in varchar2) return varchar2 is
 begin
 return utl_raw.cast_to_varchar2(utl_encode.base64_decode(utl_raw.cast_to_raw(t)));
 end from_base64;
begin
  output:=from_base64('Qjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzAxMg==');
     dbms_output.put_line(output);
     insert into demo values ( output );
     commit;
     counter :=  regexp_count(output , chr(13) , 1 , 'i' ) + 1;
     dbms_output.put_line('counter is '||counter||' ');
     for var in 1 .. counter 
     loop 
        if var=1 
        then
            v_curr_val := regexp_substr( output, '[^'||CHR(10)||CHR(13)||']+' , 1, 1 );
        elsif var < counter
        then
            v_curr_val :=  regexp_substr( output, '[^'||CHR(10)||CHR(13)||']+' , 1, var );
        end if;
        insert into demo values ( v_curr_val );
    end loop;
     commit;
     end;
    /

    B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
B88206
B88207
B77012
counter is 24

PL/SQL procedure successfully completed.

SQL> select count(*) from demo ;

  COUNT(*)
----------
        24

SQL>


13 commentaires

c'est le même code que j'ai utilisé. Mais lorsque vous sélectionnez * à partir de la table, comment l'obtenez-vous dans 3 rangées différentes? Je l'obtiens en une seule rangée


C'est le même code. Je n'ai pas changé de ligne de ça. C'est le comportement normal de UTL_RAW dans ce cas. SQLPLUS montre trois valeurs scindées, mais c'est une ligne et une valeur. Quelle version Oracle utilisez-vous ??


Comme vous l'avez mentionné, c'est une ligne et une valeur que j'en veux 3 rangées et 1 colonne. Si la longueur de la chaîne décodée est 600, il doit s'agir de 100 rangées et 1 colonne.


une seconde, je vais mettre à jour la réponse pour mettre aussi comment faire ça


Ma réponse couvre maintenant la conversion à autant de lignes que nécessaire par la valeur initiale. S'il vous plaît, si vous avez accepté, uppote et acceptez la réponse. Merci


@prudhvibikumalla, pouvez-vous accepter la réponse ?? Merci


Oui, il fonctionne correctement qu'un petit changement est nécessaire, je suppose. Lorsque vous sélectionnez * à partir de la démonstration, vous obtenez la même valeur répétée (B88207). Où devrait-on faire le changement?


tu as complètement raison. La dernière partie de la boucle ne reçoit pas la bonne valeur car elle ne récupère pas la dernière valeur. Une seconde


Réponse modifiée, vous avez maintenant les trois valeurs différentes


Oui, cela fonctionne bien pour 3 valeurs. Merci beaucoup roberto. Merci beaucoup. Mais je l'ai essayé avec 24 valeurs avec la chaîne encodée ci-dessous « Qjg4MjA2DQpCODgyMDcNCkI3NzAxMg0KQjg4MjA2DQpCODgyMDcNCkI3NzA xMg0KQjg4MjA2DQpCODg yMDcNCkI3NzAxMg0KQjg 4MjA2DQpCODgyMDcNCkI 3NzAxMg0KQjg4MjA2DQp CODgyMDcNCkI3NzAxMg0 KQjg4MjA2DQpCODgyMDc NCkI3NzAxMg0KQjg4MjA 2DQpCODgyMDcNCkI3NzA xMg0KQjg4MjA2DQpCODg yMDcNCkI3NzAxMg == » son ne fonctionne pas correctement. Pouvez-vous confirmez s'il vous plaît? Il donne des valeurs nulles entre les deux.


@prudhvibikumalla, vous avez déjà accepté une réponse.


Y a-t-il une façon de pouvoir accepter deux réponses? J'ai eu une très bonne discussion et des intrants appropriés de votre part. C'était utile. Merci beaucoup.


@prudhvibikumhalla, malheureusement, vous ne pouvez pas. Mais merci de vos commentaires



0
votes

Essayez celui-ci:

insert into demo(column_1)
select regexp_substr(output, '[^'||CHR(10)||CHR(13)||']+', 1, level) 
from dual
connect by regexp_substr(output, '[^'||CHR(10)||CHR(13)||']+', 1, level) is not null


0 commentaires