0

I have a variable, vTipoIdCompartido, reported that the name of a column. But it seems you can not do it that way because it gives me error 'ora-01733 virtual column not allowed here', every time I use it. Do I have to do differently?

    create or replace PROCEDURE spCompartirPrestacion
(
    pIdQuien IN PRESTACIONES.IDPRESTACION%TYPE,
    pIdConQuien IN PRESTACIONES.IDPRESTACION%TYPE,
    pTipo NUMBER
)
AS
    vIdCompartidoQuien PRESTACIONES.IDCOMPARTIDOANUAL%TYPE := null;
    vIdCompartidoConQuien PRESTACIONES.IDCOMPARTIDOEVENTO%TYPE := null;
    vIdCompartido PRESTACIONES.IDCOMPARTIDOEVENTO%TYPE := null;
    vTipoIdCompartido CHAR(20) := null;

    BEGIN

    IF pTipo = 0 THEN -- ANUAL
        vTipoIdCompartido := 'IDCOMPARTIDOANUAL';
    ELSE -- EVENTO
        vTipoIdCompartido := 'IDCOMPARTIDOEVENTO';
    END IF;

    SELECT vTipoIdCompartido
    INTO   vIdCompartidoQuien
    FROM   PRESTACIONES
    WHERE  IDPRESTACION = pIdQuien;

    SELECT vTipoIdCompartido
    INTO   vIdCompartidoConQuien
    FROM   PRESTACIONES
    WHERE  IDPRESTACION = pIdConQuien;

    vIdCompartido := TO_NUMBER(to_char(systimestamp,'yyyyMMddHHmmssff'));

    IF vIdCompartidoQuien = null AND vIdCompartidoConQuien = null THEN

        UPDATE PRESTACIONES SET
        vTipoIdCompartido = vIdCompartido,
        ESTOPECOMPARTIDOANUAL = 1
        WHERE IDPRESTACION = pIdQuien;

        UPDATE PRESTACIONES SET
        vTipoIdCompartido = vIdCompartido,
        ESTOPECOMPARTIDOANUAL = 1
        WHERE IDPRESTACION = pIdConQuien;

        COMMIT;
        RETURN;
    END IF;

    IF vIdCompartidoQuien != null OR vIdCompartidoConQuien != null THEN

    IF vIdCompartidoQuien = null THEN
        UPDATE PRESTACIONES SET
        vTipoIdCompartido = vIdCompartidoConQuien,
        ESTOPECOMPARTIDOANUAL = 1
        WHERE IDPRESTACION = pIdQuien;

        COMMIT;
        RETURN;
    END IF;

    IF vIdCompartidoConQuien = null THEN
        UPDATE PRESTACIONES SET
        vTipoIdCompartido = vIdCompartidoQuien,
        ESTOPECOMPARTIDOANUAL = 1
        WHERE IDPRESTACION = pIdConQuien;
        COMMIT;
        RETURN;
    END IF;

    END IF;

    IF vIdCompartidoQuien != null AND vIdCompartidoConQuien != null THEN
        UPDATE PRESTACIONES SET
        vTipoIdCompartido = vIdCompartidoConQuien,
        ESTOPECOMPARTIDOANUAL = 1
        WHERE IDPRESTACION = pIdQuien;
        COMMIT;
        RETURN;

    END IF;

END spCompartirPrestacion;

CREATE TABLE "SERMECOOP"."PRESTACIONES"(
"IDPLAN" NUMBER(9,0) NOT NULL ENABLE, 
"IDPRESTACION" NUMBER(9,0), 
"IDBENEFICIO" NUMBER(9,0) NOT NULL ENABLE, 
"BONIFICACION" NUMBER(9,0), 
"CARENCIA" NUMBER(9,0), 
"TOPEPOREVENTO" NUMBER(19,4), 
"TOPEANUAL" NUMBER(19,4), 
"SINTOPE" NUMBER(1,0) DEFAULT '0', 
"ESTOPECOMPARTIDOEVENTO" NUMBER(1,0) DEFAULT '0', 
"IDBENEFICIOPADRE" NUMBER(9,0), 
"IDCATEGORIABENEFICIO" NUMBER(9,0), 
"EXCEPCION" NUMBER(1,0) DEFAULT '0', 
"IDPORCENTAJEEXCEPCION" NUMBER(9,4), 
"IDBENEFICIOCOMPARTIDO" NUMBER(9,0), 
"ESTOPECOMPARTIDOANUAL" NUMBER(1,0) DEFAULT '0', 
"IDCOMPARTIDOANUAL" NUMBER(20,0), 
"IDCOMPARTIDOEVENTO" NUMBER(20,0), 
 PRIMARY KEY ("IDPRESTACION"))
kowalcyck
  • 103
  • 3
  • 11
  • Please add the DDL statements for the used tables/views to your question (wild guess: You're probably trying to update a view. Instead of updating the view, try updating the table directly, or use an INSTEAD OF trigger) – Frank Schmitt Jun 17 '15 at 11:05
  • @FrankSchmitt, DDL add, thanks. – kowalcyck Jun 17 '15 at 11:36
  • @kowalcyck in the table `PRESTACIONES` i can't see any column as name `vTipoIdCompartido`. – Sachu Jun 17 '15 at 11:44
  • You can't use a variable as a column name (in either the select or update) unless you resort to dynamic SQL; but that gives `ORA-00904: "VTIPOIDCOMPARTIDO": invalid identifier`. I don't see how you can be getting ORA-01733 from this. Are you sure that is your current table definition and it hasn't been modified? Do you see that error at compile time or runtime? – Alex Poole Jun 17 '15 at 11:50
  • @AlexPoole, error at compile time – kowalcyck Jun 17 '15 at 12:57

0 Answers0