简体   繁体   English

在过程中执行varchar2时出错

[英]error when executing a varchar2 in a procedure

I have a varchar2 with an INSERT and I want to execute it in a procedure I try to do it with an execute but this happens: 我有一个带有INSERT的varchar2,我想在我尝试执行的过程中执行它,但这会发生:

EXECUTE IMMEDIATE sql_str; 

Error: 错误:

ERROR at line 1:
ORA-00911: invalid character
ORA-06512: at "SYS.INSERT_MOVIMIENTOS", line 47
ORA-06512: at line 1

Varchar2 carries an insert that is this and works if I paste it but when executing it in the procedure something of the procedure fails. Varchar2带有一个这样的插入物,如果我将其粘贴,则可以正常工作,但是在过程中执行该插入过程时某些过程将失败。

INSERT INTO MOVIMIENTOS (COD_BANCO, COD_SUCUR, NUM_CTA, FECHA_MOV, TIPO_MOV, IMPORTE) VALUES (2000, 2000, 0, '11/11/08', 'I', 500);

My procedure 我的程序

CREATE OR REPLACE PROCEDURE INSERT_MOVIMIENTOS (
    INSERTMOV_COD_BANCO IN NUMBER,
    INSERTMOV_COD_SUCUR IN NUMBER,
    INSERTMOV_NUM_CTA   IN NUMBER,
    INSERTMOV_FECHA_MOV IN DATE,
    INSERTMOV_TIPO_MOV  IN CHAR,
    INSERTMOV_IMPORTE   IN NUMBER
)
IS
    sql_str VARCHAR2(500) := 'INSERT INTO MOVIMIENTOS (';
    movimiento movimientos_typ;
BEGIN
    movimiento := movimientos_typ(
        INSERTMOV_COD_BANCO,
        INSERTMOV_COD_SUCUR,
        INSERTMOV_NUM_CTA,
        INSERTMOV_FECHA_MOV,
        INSERTMOV_TIPO_MOV,
        INSERTMOV_IMPORTE
    );

IF movimiento.getCOD_BANCO() != 0 THEN
    sql_str := sql_str || 'COD_BANCO, COD_SUCUR, NUM_CTA, FECHA_MOV, TIPO_MOV, IMPORTE) VALUES (' ||
    movimiento.getCOD_BANCO() || ', ' ||
    movimiento.getCOD_SUCUR() || ', ' ||
    movimiento.getNUM_CTA() || ', ''' ||
    movimiento.getFECHA_MOV() || ''', ''' ||
    movimiento.getTIPO_MOV() || ''', ' ||
    movimiento.getIMPORTE() || ');';
ELSE
    sql_str := sql_str || 'COD_SUCUR, NUM_CTA, FECHA_MOV, TIPO_MOV, IMPORTE) VALUES (' ||
    movimiento.getCOD_SUCUR() || ', ' ||
    movimiento.getNUM_CTA() || ', ''' ||
    movimiento.getFECHA_MOV() || ''', ''' ||
    movimiento.getTIPO_MOV() || ''', ' ||
    movimiento.getIMPORTE() || ');';
END IF;

    DBMS_OUTPUT.PUT_LINE('////////////////////////////////////////');
    DBMS_OUTPUT.PUT_LINE('CONSULTA: ' || sql_str);

    DBMS_OUTPUT.PUT_LINE('////////////////////////////////////////');
     DBMS_OUTPUT.PUT_LINE('DATOS INTRODUCIDOS: ');
    movimiento.display;

    DBMS_OUTPUT.PUT_LINE('////////////////////////////////////////');
    EXECUTE IMMEDIATE sql_str; 
    DBMS_OUTPUT.PUT_LINE('FUNCION REALIZADA CON EXITO');
END;
/

Donot end with the semicolon ; 不要以分号结尾; in your query string. 在您的查询字符串中。

   movimiento.getIMPORTE() || ')';

The error is just because of it. 该错误仅是因为它。

by the way, you should be using bind variables. 顺便说一句,您应该使用绑定变量。 Dynamically constructing the values this way is vulnerable to SQL Injection . 以这种方式动态构造值容易受到SQL Injection的攻击。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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