ORA-01733- virtual column not allowed here  - Insert using inline view

Does anyone know why I am getting ORA-01733- virtual column not allowed here
SQL> select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
---no error without WITH CHECK option
SQL> INSERT INTO
2 (SELECT
3 location_id,
4 city,
5 l.country_id
6 FROM countries c, locations l,regions r
7 where l.country_id = c.country_id
8 and r.region_id=c.region_id
9 and r.region_name = 'Asia')
10 VALUES (5500, 'Wansdworth Common', 'UK');
1 row created.
SQL> rollback;
Rollback complete.
-----error with WITH CHECK OPTION
SQL> INSERT INTO
2 (SELECT
3 location_id,
4 city,
5 l.country_id
6 FROM countries c, locations l,regions r
7 where l.country_id = c.country_id
8 and r.region_id=c.region_id
9 and r.region_name = 'Asia' WITH CHECK OPTION)
10 VALUES (5500, 'Wansdworth Common', 'UK');
INSERT INTO
ERROR at line 1:
ORA-01733: virtual column not allowed here
I was expecting
ORA-01402: view WITH CHECK OPTION where-clause violation
for the second one. Is there anything I am missing here ?

Randolf
Thank you very much for the update to this old question
After reading the link I think I should ignore this error and accept it as ORA-01402
The information you asked me to check did not lead me an understanding of different error types.
SQL> ----view for ORA-01733
SQL> create view test_v_1
  2  as
  3  SELECT
  4  location_id,
  5  city,
  6  l.country_id
  7  FROM countries c, locations l,regions r
  8  where l.country_id = c.country_id
  9  and r.region_id=c.region_id
10  and r.region_name = 'Asia' WITH CHECK OPTION;
View created.
SQL>
SQL>
SQL>
SQL> select * from user_updatable_columns where table_name='TEST_V_1';
OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
HR                             TEST_V_1                       CITY                           YES YES YES
HR                             TEST_V_1                       COUNTRY_ID                     NO  NO  NO
HR                             TEST_V_1                       LOCATION_ID                    YES YES YES
SQL>
SQL> ----view for ORA-01402
SQL>
SQL> create view test_v_2
  2  as
  3  SELECT
  4  d.department_id,
  5  d.department_name,
  6  d.location_id
  7  FROM hr.departments d,hr.locations l
  8  WHERE l.location_id=d.location_id
  9  and d.location_id < 2000
10  WITH CHECK OPTION;
View created.
SQL>
SQL> select * from user_updatable_columns where table_name='TEST_V_2';
OWNER                          TABLE_NAME                     COLUMN_NAME                    UPD INS DEL
HR                             TEST_V_2                       DEPARTMENT_ID                  YES YES YES
HR                             TEST_V_2                       DEPARTMENT_NAME                YES YES YES
HR                             TEST_V_2                       LOCATION_ID                    NO  NO  NO
SQL>
SQL>
SQL> ----INSERT STILL FAILING WITH DIFFERENT ERROR DESPITE THE SAME UPDATABLE COLUMN STRUCTURE
SQL> insert into test_v_1 values  (5500, 'Wansdworth Common', 'UK');
insert into test_v_1 values  (5500, 'Wansdworth Common', 'UK')
ERROR at line 1:
ORA-01733: virtual column not allowed here
SQL> insert into test_v_2 values  (9999, 'Entertainment', 2500);
insert into test_v_2 values  (9999, 'Entertainment', 2500)
ERROR at line 1:
ORA-01402: view WITH CHECK OPTION where-clause violation
SQL>A. Coskan GUNDOGAR
Oracle DBA
http://coskan.wordpress.com
“A man's errors are his portals of discovery.”
James Joyce

Similar Messages

  • Virtual Column not allowed here Error

    Hi All,
    I am facing "Virtual Column not allowed here" Error when running a simple select statement. I have identified that if I am removing a primary key constraint and an index on top of month table which is used in the SQL solving this issue. But want to know the exact reason of this error. FYI I am having two indexes on Month_end_date_key (which is also a primary key) and Month_end_date. Could you please let me know the reason for this.
    FYI I am not doing any insert,update deletion operations. I am using only the tables in the SQL not using any views.
    Regards,
    Radhakrishna

    924486 wrote:
    Hi All,
    I am facing "Virtual Column not allowed here" Error when running a simple select statement. I have identified that if I am removing a primary key constraint and an index on top of month table which is used in the SQL solving this issue. But want to know the exact reason of this error. FYI I am having two indexes on Month_end_date_key (which is also a primary key) and Month_end_date. Could you please let me know the reason for this.
    FYI I am not doing any insert,update deletion operations. I am using only the tables in the SQL not using any views.
    Regards,
    RadhakrishnaAre you sure none of those is a view?
    Cause:     An attempt was made to use an INSERT, UPDATE, or DELETE statement on an expression in a view.
    Action:     INSERT, UPDATE, or DELETE data in the base tables, instead of the view.

  • When Closing the window giving error " Virtual Column not allowed"

    Hi All,
    In my main block, i have a button, on clicking which will open a new window(block) with a free text field to enter.
    I have a Save button in a new window which will save entered text fiedl and refresh the main block to see the value entered in a new block.
    But suppose, if entered something in text field and without saving if i close the window and try to exit from the form
    It is asking me to save the form or not and if i press Yes
    Then it gives me below error
    ORA-01733: virtual column not allowed here
    FRM-40508: ORACLE error: unable to INSERT record.
    If i see from Display database error' It is trying to insert the record into the view On which my new block has based( i know it is not possible).
    Any suggestion on this please?
    Thanks,
    pavan

    Pavan,
    How are you populating your block? It sounds like you are populating the block manually (eg; Looping through a cursor and assigning values to each row of your block). If this is what you are doing, then YES you will get these kinds of errors. Ideally, you should base your data block on your data (either directly on the base table or view of if you are using a query, then a FROM Clause based block).
    I'm guessing here, so would you mind posting a description of your data block(s) is/are set up?
    Craig...

  • Virtual column not allowed while creating "simple view"

    hi,
    i have created a simple view
    systax:
    create view empvu30
    as select empno id_number,ename Name,sal*12 ANN_SALARY
    from emp where deptno=30;
    when i am going to update this view i am getting error:
    ORA-01733: virtual column not allowed here

    user10492712 wrote:
    hi,
    i have created a simple view
    systax:
    create view empvu30
    as select empno id_number,ename Name,sal*12 ANN_SALARY
    from emp where deptno=30;
    when i am going to update this view i am getting error:
    ORA-01733: virtual column not allowed hereThe error is correct as you have a transformation done on the Sal column which can't be updated. That's why the error is thrown to you.
    Please read this link,
    http://download.oracle.com/docs/cd/E11882_01/server.112/e10595/views001.htm#i1006127
    >
    If the view was created by using an expression, such as DECODE(deptno, 10, "SALES", ...), then rows cannot be inserted into or updated in the base table using the view.>
    HTH
    @Pavan,
    That's different question altogether. I don't think OP question falls in that thread's context.
    Aman....

  • PL/SQL: ORA-00984: column not allowed here

    I am Trying to compile this procedure, but i get error, could please anybody help me out.
    Thanks.
    SQL> create or replace procedure FOF_sport_setup(
    2 v_model_cd in varchar2, -- model_cd used in many place
    3 v_portfolio_name in varchar2, -- portfolio name
    4 v_src_acct_nbr in varchar2, -- source account number for port
    5 v_src_fund_nbr in varchar2, -- source fund number
    6 v_fmr_fund_nbr in varchar2, -- fidelity fund number
    7 v_src_cd in varchar2, -- source code
    8 v_last_mod_id in varchar2 -- your corp id
    9 )
    10 as
    11 v_new_portf_id number(12);
    12
    13 begin
    14
    15 select max(portf_id) into v_new_portf_id from portfolios;
    16
    17 insert into portfolios
    18 (portf_id,
    19 portf_cd,
    20 portf_name,
    21 portf_typ_cd,
    22 inception_date,
    23 sub_product_cd,
    24 product_cd,
    25 product_line_cd,
    26 bus_line_cd,
    27 dly_perf_restr_ind,
    28 portf_mgr_id,
    29 seed_acct_nbr,
    30 use_epas_ind,
    31 epas_drop_perf_ind,
    32 src_acct_nbr,
    33 src_fund_nbr,
    34 fmr_fund_nbr,
    35 src_cd,
    36 last_mod_id,
    37 last_mod_dt)
    38 values
    39 (new_portf_id,
    40 v_model_cd,
    41 v_portfolio_name,
    42 "RETAIL",
    43 v_inception_date,
    44 "FREE",
    45 "FREE",
    46 "FREE",
    47 "PAS",
    48 "Yes",
    49 3,
    50 "31635C101",
    51 "N",
    52 "Y",
    53 v_src_acct_nbr,
    54 v_src_fund_nbr,
    55 v_fmr_fund_nbr,
    56 v_src_cd,
    57 v_last_mod_id,
    58 sysdate);
    59
    60 end;
    61 /
    Warning: Procedure created with compilation errors.
    SQL> show errors procedure FOF_sport_setup
    Errors for PROCEDURE FOF_SPORT_SETUP:
    LINE/COL ERROR
    17/2 PL/SQL: SQL Statement ignored
    51/3 PL/SQL: ORA-00984: column not allowed here
    SQL>

    create or replace procedure FOF_sport_setup(
    v_model_cd in varchar2, -- model_cd used in many places for portf_id,
    v_portfolio_name in varchar2, -- portfolio name
    v_inception_date in varchar2,
    v_src_acct_nbr in varchar2, -- source account number for portfolio table in sport db
    v_src_fund_nbr in varchar2, -- source fund number
    v_fmr_fund_nbr in varchar2, -- fidelity fund number
    v_src_cd in varchar2, -- source code
    v_last_mod_id in varchar2 -- your corp id
    as
    v_new_portf_id number(12);
    begin
    select max(portf_id) into v_new_portf_id from portfolios;
    insert into portfolios
    (portf_id,
    portf_cd,
    portf_name,
    portf_typ_cd,
    inception_date,
    sub_product_cd,
    product_cd,
    product_line_cd,
    bus_line_cd,
    dly_perf_restr_ind,
    portf_mgr_id,
    seed_acct_nbr,
    use_epas_ind,
    epas_drop_perf_ind,
    src_acct_nbr,
    src_fund_nbr,
    fmr_fund_nbr,
    src_cd,
    last_mod_id,
    last_mod_dt)
    values
    (v_new_portf_id,
    v_model_cd,
    v_portfolio_name,
    'RETAIL',
    to_date('v_inception_date'),
    'FREE',
    'FREE',
    'FREE',
    'PAS',
    'Yes',
    3,
    '31635C101',
    'N',
    'Y',
    v_src_acct_nbr,
    v_src_fund_nbr,
    v_fmr_fund_nbr,
    v_src_cd,
    v_last_mod_id,
    sysdate);
    end;
    =====================
    The procedure got created without any errors, when i am trying to execute the procedure i am getting errors.
    this is the parameters which i am passing:
    exec FOF_sport_setup('01213', 'PAS International Fund of Funds', '2/15/2006', '01213', 'IFOFB', 'IFOFB', 'FPCMS', 'a382077')
    SQL> exec FOF_sport_setup('01213', 'PAS International Fund of Funds', '2/15/2006', '01213', 'IFOFB',
    'IFOFB', 'FPCMS', 'a382077')
    BEGIN FOF_sport_setup('01213', 'PAS International Fund of Funds', '2/15/2006', '01213', 'IFOFB', 'IF
    ERROR at line 1:
    ORA-01858: a non-numeric character was found where a numeric was expected
    ORA-06512: at "SPORT.FOF_SPORT_SETUP", line 15
    ORA-06512: at line 1
    ===============
    the description for the table is below
    ===========
    SQL> desc portfolios
    Name Null? Type
    PORTF_ID NOT NULL NUMBER(25)
    PORTF_CD VARCHAR2(10)
    PORTF_NAME VARCHAR2(60)
    STRATEGY_CD VARCHAR2(10)
    CO_STOCK_LEV_CD VARCHAR2(10)
    EFF_DATE DATE
    PORTF_WEB_NAME VARCHAR2(60)
    PORTF_TYP_CD VARCHAR2(10)
    INCEPTION_DATE DATE
    CLOSE_DATE DATE
    SUB_PRODUCT_CD VARCHAR2(10)
    PRODUCT_CD VARCHAR2(10)
    PRODUCT_LINE_CD VARCHAR2(10)
    BUS_LINE_CD VARCHAR2(10)
    BUS_GRP_CD VARCHAR2(10)
    PLAN_CD VARCHAR2(10)
    ADVISOR_CD VARCHAR2(10)
    RISK_LEVEL_CD VARCHAR2(10)
    DLY_PERF_RESTR_IND VARCHAR2(3)
    SUB_PORTF_IND CHAR(1)
    PORTF_MGR_ID NUMBER(25)
    SEED_ACCT_NBR VARCHAR2(9)
    OBJECTIVE VARCHAR2(255)
    PORTF_COMPOSITION_DESC VARCHAR2(50)
    LGL_GRP VARCHAR2(30)
    USE_EPAS_IND VARCHAR2(3)
    EPAS_MODEL_NAME VARCHAR2(50)
    EPAS_DROP_PERF_IND VARCHAR2(3)
    SRC_ACCT_NBR VARCHAR2(15)
    SRC_FUND_NBR VARCHAR2(6)
    FMR_FUND_NBR VARCHAR2(6)
    NET_ASSETS NUMBER(25,8)
    SEED_MKT_VAL NUMBER(25,10)
    ACCT_MKT_VAL NUMBER(25,10)
    TOTAL_ASSETS NUMBER(25,10)
    NET_OTHER_ASSETS NUMBER(25,8)
    ACCRUED_INCOME NUMBER(25,10)
    ACCRUED_INTEREST NUMBER
    LIABILITIES NUMBER(25,10)
    SHARES_OUTSTANDING NUMBER(25,10)
    PRINCIPAL_CASH NUMBER(25,10)
    INCOME_CASH NUMBER(25,10)
    INVESTIBLE_CASH NUMBER(25,10)
    SHIP_DATE DATE
    REBALANCE_IND CHAR(1)
    OUTBOUND_IND VARCHAR2(5)
    LGL_MSG_CD CHAR(1)
    LAST_SETTLE_DATE DATE
    LAST_TRD_DATE DATE
    LAST_ALLOC_DATE DATE
    STATUS_CD CHAR(1)
    SRC_CD NOT NULL VARCHAR2(5)
    LAST_MOD_ID NOT NULL VARCHAR2(10)
    LAST_MOD_DT NOT NULL DATE
    PORTF_MGD_CD VARCHAR2(10)
    ==========

  • ORA-00984 Column not allowed here. Please help.

    Hey, I have made a table;
    CREATE TABLE Borrower (
    BorId VARCHAR2(5) NOT NULL,
    BorName VARCHAR2(20),
    BorMaxBooks NUMBER(10),
    PRIMARY KEY (BorId));
    I am trying to enter values into this table;
    INSERT INTO Borrower VALUES (
    001, "Jack Jones", 5);
    And I get an error; ORA-00984 Column not allowed here. Please can anyone help?? I have tried changing BorName VARCHAR2(20) to BorName CHAR(20) and everything I can think of.

    Hi sorry to bother you again but is it the same method as in MySQL to enter multiple data at once?
    I am trying to save time by entering all the contents of a table all at once,
    Would it be;
    INSERT INTO Borrower (BorId, BorName, BorMaxBooks) VALUES (
    (001, 'Bob', 4),
    (002, 'James', 5),
    (003, 'Dave', 6);
    Thanks.

  • Help - error : ORA-00984: Column not allowed here

    Hi,
    I'm writing a simple Java program to update values into Oracle tables. But getting error - 'ORA-00984: Column not allowed here' in the line - sql2.executeUpdate(acctTabSql);
    There is no column name used in 'insert statement - and referred suggestion here to resolve the error, but couldn't. Please write me how to resolve it. ?
    Here is the code snippet below.
    Thanks, Vasu
    T_ACCT
    ACCT_ID (PK) GEN INTEGER
    ALS_NBR:STRING
    STATUS_CD:STRING
    NOTE_DT:DATE
    int intVal1 = 0;
              int intVal2 = 0;
              Statement sql1 = oraConnection.createStatement();
              ResultSet rs = sql1.executeQuery("SELECT ACCT_ID_SEQ.NEXTVAL, APPL_ID_SEQ.NEXTVAL FROM DUAL");
              while(rs.next()){
              intVal1 = rs.getInt(1);
              intVal2 = rs.getInt(2);
              System.out.println("ACCT_ID :" + intVal1);
              System.out.println("APPL_ID :" + intVal2);
              sql1.close();
              Statement sql2 = oraConnection.createStatement();
              String acctTabSql = "INSERT INTO VPDBO.T_ACCT (ACCT_ID, ALS_NBR, NOTE_DT, HELMS_NBR, SL_REF_NBR, BK_MSG_RECEIVED_DT) " +
                        "VALUES (intVal1,'' ,'' ,'' ,'' ,'' )";
              System.out.println(acctTabSql);
    -/Error/-     sql2.executeUpdate(acctTabSql);
              sql2.close();
              Statement sql3 = oraConnection.createStatement();
              String applTabSql = "INSERT INTO T_APPL (APPL_ID, ACAPS_ID, STATUS_CD, ACAPS_PROD_CD, ACCT_ID, DCAPP_MSG_RECEIVED_DT) " +
                        "VALUES (intVal1, valappIdValue, 'EN', '', intVal2, '08/26/09')";
              System.out.println(applTabSql);
              sql3.executeUpdate(applTabSql);
              sql3.close();
              oraConnection.commit();

    Hi,
    make sure final statement is like :
    INSERT INTO VPDBO.T_ACCT (ACCT_ID, ALS_NBR, NOTE_DT, HELMS_NBR, SL_REF_NBR, BK_MSG_RECEIVED_DT)
    VALUES(intVal1,NULL,NULL,NULL,NULL,NULL)instead of
    String acctTabSql = "INSERT INTO VPDBO.T_ACCT (ACCT_ID, ALS_NBR, NOTE_DT, HELMS_NBR, SL_REF_NBR, BK_MSG_RECEIVED_DT) " +
    "VALUES (intVal1,'' ,'' ,'' ,'' ,'' )";Cheers,
    Avin ash

  • Execute immediate column not allowed here error

    Hi,
    I have the following procedure
    CREATE OR REPLACE PROCEDURE SWF_ICD
    IS
         SEQSWF NUMBER;
         req VARCHAR2(1000):='';
    BEGIN
         DBMS_OUTPUT.ENABLE( 1000000 ) ;
         DBMS_OUTPUT.PUT_LINE('DEBUT');
         FOR CUR1 IN (SELECT * FROM ICD WHERE ETAICD=5)
         LOOP
              SELECT SEQ_SWF.NEXTVAL INTO SEQSWF FROM DUAL;
              FOR CUR2 IN (SELECT CODCSWSSW,CODSSW,RUBSSW FROM SSW,OSW
              WHERE INSOSW='ICD' AND CODCSWSSW=CODCSWOSW)
              LOOP
                   req:= 'INSERT INTO SWF (SEQESWSWF,CODCSWSWF,CODSSWSWF,VALSWF) '
                   || 'VALUES (CUR2.SEQSWF,CUR2.CODCSWSSW,CUR2.CODSSW,CUR1.' || CUR2.RUBSSW || ')';
                   DBMS_OUTPUT.PUT_LINE('req : ' || req);
                   EXECUTE IMMEDIATE req;
              END LOOP;
         END LOOP;
         DBMS_OUTPUT.PUT_LINE('FIN');
    END;
    The procedure is created but when running i have the following error column not allowed here.
    pls advise.

    Hi
    Try EXECUTE IMMEDIATE sql USING ... syntax.
    EXECUTE IMMEDIATE dynamic_string
    [INTO {define_variable[, define_variable]... | record}]
    [USING [IN | OUT | IN OUT] bind_argument
    [, [IN | OUT | IN OUT] bind_argument]...]
    [{RETURNING | RETURN} INTO bind_argument[, bind_argument]...];
    Please see the link for more info.
    http://download-west.oracle.com/docs/cd/B10501_01/appdev.920/a96624/11_dynam.htm#13131
    Thanks

  • Getting the error column not allowed here in jdbc

    i have got an error
    when using jdbc.
    i have inserted the data from taking java textfields.
    The error is:column not allowed here.
    how to rectify this?
    iam eagerly waiting for ur reply.

    Hi,
    This is the forum for the SQL Developer Data Modeler product.
    I suggest you try asking your question on the SQL and PL/SQL Forum: PL/SQL
    David

  • ORA-02253: constraint specification not allowed here

    I'm trying to create a table clients with primairy key, but I'm getting the error "ORA-02253: constraint specification not allowed here"
    if anyone call what to do
    CREATE TABLE CLIENTS
    NUMERO NUMBER(6) CONSTRAINT PK_CLIENTS PRIMAIRY KEY,
    NOM VARCHAR(63), NOT NULL,
    PRENOM VARCHAR(63),
    NAISSANCE DATE
    Edited by: user10397656 on Oct 13, 2008 1:40 AM

    There are some errors in your script :
    PK_CLIENTS PRIMAIRY KEY
    and
    NOM VARCHAR(63)*,* NOT NULL,
    Try this way
    CREATE TABLE CLIENTS
    NUMERO NUMBER(6) CONSTRAINT PK_CLIENTS PRIMARY KEY,
    NOM VARCHAR(63) NOT NULL,
    PRENOM VARCHAR(63),
    NAISSANCE DATE
    );

  • Received ORA-22818 subquery expressions not allowed here when creating mate

    Hello,
    I was trying to create a materialized view to describe the referential integrity between the tables in my schema:
    create materialized view user_references
    tablespace tbspc
    build immediate
    using index
    refresh complete on demand next sysdate + 1
    as
    select uic.table_name to_table, uic.column_name to_column,
    ucc.table_name from_table, ucc.column_name from_column
    from user_ind_columns uic, user_constraints uc, user_cons_columns ucc
    where uic.index_name = uc.r_constraint_name
    and uc.constraint_name = ucc.constraint_name
    and uc.owner=upper('my_schema');
    I was able to create this MV in Oracle 9.2. It failed with the following error when I ran it against Oracle 10.1:
    from user_ind_columns uic, user_constraints uc, user_cons_columns ucc
    ERROR at line 9:
    ORA-22818: subquery expressions not allowed here
    Is not allowing subqueries in MV a new restriction in Oracle 10? Is there a workaround?
    Thanks

    Hello
    This may be a bug in your version as I can do it successfully on 10.2
    tylerd@DEV2> create materialized view user_references
      2  build immediate
      3  using index
      4  refresh complete on demand next sysdate + 1
      5  as
      6  select uic.table_name to_table, uic.column_name to_column,
      7  ucc.table_name from_table, ucc.column_name from_column
      8  from user_ind_columns uic, user_constraints uc, user_cons_columns ucc
      9  where uic.index_name = uc.r_constraint_name
    10  and uc.constraint_name = ucc.constraint_name
    11  and uc.owner=upper('my_schema');
    Materialized view created.
    tylerd@DEV2> select * from v$version
      2  /
    BANNER
    Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Prod
    PL/SQL Release 10.2.0.2.0 - Production
    CORE    10.2.0.2.0      Production
    TNS for 32-bit Windows: Version 10.2.0.2.0 - Production
    NLSRTL Version 10.2.0.2.0 - Production
    5 rows selected.HTH
    David

  • Database trigger - PL/SQL: ORA-00984: column not allowed here

    I am trying to create a trigger that will update an employee audit table when a row is changed. Using a sequence number to assign a unique identifier to each row as it is created. Need to capture the user ID, date of the change, and the action (update), plus the before image of the row.
    CREATE SEQUENCE emp_audit_seq START WITH 10;               
    Create table emp (
       empno       NUMBER(4)      Primary Key,
       ename       VARCHAR2(10),
       job            VARCHAR2(9),
       mgr           NUMBER(4),
       hiredate     DATE,
       sal             NUMBER(7,2),
       comm        NUMBER(7,2),
       deptno       NUMBER(2));
    CREATE TABLE emp_audit   (
         audit_uid          NUMBER(15)      Primary Key,
         change_date          DATE,
         change_user          VARCHAR2(30),
         action                  CHAR(1),
         empno                  NUMBER(4),
         ename                  VARCHAR2(10),          
         job               VARCHAR2(9),
         mgr               NUMBER(4),
         hiredate          DATE,
         sal               NUMBER(7,2),
         comm                  NUMBER(7,2),
         deptno                  NUMBER(2));
    CREATE OR REPLACE TRIGGER trig_emp_audit
      BEFORE UPDATE ON emp
      FOR EACH ROW
    BEGIN
      INSERT INTO emp_audit
        VALUES(emp_audit_seq.nextval, change_date, change_user, action, :old.empno, :old.ename, :old.job, :old.mgr, :old.hiredate, :old.sal, :old.comm, deptno);
    END;
    Warning: Trigger created with compilation errors.
    SQL> show errors
    Errors for TRIGGER TRIG_EMP_AUDIT:
    LINE/COL ERROR
    2/3      PL/SQL: SQL Statement ignored
    3/149    PL/SQL: ORA-00984: column not allowed hereCan anyone assist in helping me find what I am doing wrong with the trigger?
    Edited by: LostNoob on Aug 25, 2012 2:24 PM

    First, when you write an INSERT statement, it's always good to list the columns that you're inserting into. That makes the code easier to follow-- you don't have to separately pull up the table definition to know what order columns are inserted. And it makes the code more maintainable since the statement won't become invalid if you add a new column to the table in the future.
    Second, CHANGE_DATE, CHANGE_USER, and ACTION are not (presumably) functions and they are not local variables so it doesn't make sense to use them in an INSERT statement. You would need to write code or leverage existing functions to populate those columns. I'm guessing, for example, that you want to use SYSDATE to populate the CHANGE_DATE and USER to populate the CHANGE_USER column. My guess is that ACTION should always be a 'U' for UPDATE.
    Third, it appears that you left off the :old on the DEPTNO column.
    Putting it all together, you'd have something like
    CREATE OR REPLACE TRIGGER trig_emp_audit
      BEFORE UPDATE ON emp
      FOR EACH ROW
    BEGIN
      INSERT INTO emp_audit(
          audit_uid,
          change_date,
          change_user,
          action,
          enpno,
          ename,
          job,
          mgr,
          hiredate,
          sal,
          comm,
          deptno )
        VALUES(
          emp_audit_seq.nextval,
          sysdate,
          user,
          'U',
         :old.empno,
         :old.ename,
         :old.job,
         :old.mgr,
         :old.hiredate,
         :old.sal,
         :old.comm,
         :old.deptno);
    END;
    / Justin

  • ORA-22818: subquery expressions not allowed here

    I am currently optimizing my report. Before, this report has only a single query for all. But when I have revised it having subquery it is performing much more faster. The problem is, I cannot perform a calculation on my query since subquery expressions are not allowed in 'group by'. Heres my sample report:
    SELECT     ab.batch_name,
    ai.invoice_amount,
    ai.invoice_date,
    ai.invoice_num,
    ai.invoice_id,
         (SELECT     pv.vendor_name
         FROM     apps.po_vendors pv
         WHERE     pv.vendor_id = ai.vendor_id)vendor_name,
         aid.distribution_line_number,
         SUM(aid.amount * (atc.tax_rate/100))amount,
         (SELECT     gcc.segment2
         FROM     apps.gl_code_combinations gcc
         WHERE     gcc.code_combination_id = aid.dist_code_combination_id)segment2,
         (SELECT     gcc.segment5
         FROM     apps.gl_code_combinations gcc
         WHERE     gcc.code_combination_id = aid.dist_code_combination_id)segment5      
    FROM     apps.ap_batches_all ab,
              apps.ap_invoices_all ai,
              apps.ap_invoice_distributions_all aid,
              apps.ap_awt_groups aag,
              apps.ap_tax_codes_all atc
    WHERE     ab.batch_id = ai.batch_id
              AND ai.invoice_id = aid.invoice_id
              AND aag.group_id = aid.awt_group_id
    GROUP BY ab.batch_name,
    ai.invoice_amount,
    ai.invoice_date,
    ai.invoice_num,
    ai.invoice_id,
         (SELECT     pv.vendor_name
         FROM     apps.po_vendors pv
         WHERE     pv.vendor_id = ai.vendor_id),
         aid.distribution_line_number,
         (SELECT     gcc.segment2
         FROM     apps.gl_code_combinations gcc
         WHERE     gcc.code_combination_id = aid.dist_code_combination_id),
         (SELECT     gcc.segment5
         FROM     apps.gl_code_combinations gcc
         WHERE     gcc.code_combination_id = aid.dist_code_combination_id)
    Can anyone advise on what to do? I really need the computation part but at the same time I would like to optimize my report using subqueries.

    You dont need to group by the actual inline SQL/sub-query but only the columns you used from the main query ( ie, aid.dist_code_combination_id, ai.vendor_id )
    You also have to make sure that the in-line SQL you are using will return not more than 1 row.
    Also, why not just use a normal join (or outer join if necessary)?

  • ORA-02287 sequence number not allowed here

    Hello
    Could someone tell my why I get this error with the following select?
    create sequence dt_test_seq start with 1 increment by 1;
    create table dt_test_tab (col1 number,col2 number, col3 number);
    insert into dt_test_tab values(1,1,1);
    insert into dt_test_tab values(1,1,1);
    insert into dt_test_tab values(1,2,2);
    insert into dt_test_tab values(2,2,3);
    insert into dt_test_tab values(2,2,3);
    select
         col1,
         col2,
         col3,
         NVL(next_val,LAG(next_val) over(partition by col1,col2 order by col1,col2))
    from
         select
              col1,
              col2,
              col3,
              CASE
                   WHEN  row_number() over (partition by col1,col2 order by col1,col2) = 1 THEN
                        dt_test_seq.nextval
              END next_val
         FROM
              dt_test_tab
         );I came across the problem while trying to come up with a single query answer to the post:Re: Call a function only on change of group of columns
    The inner query works fine but the error comes when it is turned into an inline view and apply a function to the next_val column.
    It's more out of curiosity than anything else as the answer that dmitry posted is obviously the right way to do it?
    And yes, I am very bored ;-)
    David

    SQL> create function getnextval return number
    2 is
    3 id number;
    4 begin
    5 select dt_test_seq.nextval into id from dual;
    6 return id;
    7 end;
    8 /
    Function created.
    SQL> edit
    Wrote file afiedt.buf
    1 select
    2 col1,
    3 col2,
    4 col3,
    5 CASE
    6 WHEN row_number() over (partition by col1,col2 order by col1,col2) = 1 THEN
    7 getnextval
    8 END next_val
    9 FROM
    10* dt_test_tab
    SQL> /
    COL1 COL2 COL3 NEXT_VAL
    1 1 1 99
    1 1 1
    1 2 2 100
    2 2 3 101
    2 2 3
    SQL> edit
    Wrote file afiedt.buf
    1 select
    2 col1,
    3 col2,
    4 col3,
    5 NVL(next_val,LAG(next_val) over(partition by col1,col2 order by col1,col2)) next_v
    6 from
    7 (
    8 select
    9 col1,
    10 col2,
    11 col3,
    12 CASE
    13 WHEN row_number() over (partition by col1,col2 order by col1,col2) = 1 THEN
    14 getnextval
    15 END next_val
    16 FROM
    17 dt_test_tab
    18* )
    SQL> /
    COL1 COL2 COL3 NEXT_V
    1 1 1 105
    1 1 1 105
    1 2 2 106
    2 2 3 107
    2 2 3 107
    Is it what you need ?
    Rgds.
    But I am afraid it's not what you need, am I not ?

  • ORA-00984: Column not allowed here.

    Hi there, I've got a little problem with the ORA-00984 error. I just begun PL/SQL, so maybe you can support me with this.
    I want to write a Trigger that fires every time a row in a table is changed or deleted. Trigger should write the following into a seperate table:
    [mumblejumble ...]
    THEN
    INSERT INTO "PROJECT"."T_HISTORY" (subtopic_id, change_date, old_schedule_date, old_description, changes_id) VALUES (
    var_subtopic_id,
    TO_DATE(sysdate,'DD.MM.YY'),
    var_old_schedule_date,
    var_old_decription,
    '1');
    troublemaker is this line:
    TO_DATE(sysdate,'DD.MM.YY'),
    Gives ORA-00984. I tried a single sysdate as well, same problem.
    Somebody got a clue or workaround? I can't figure out how to insert the sysdate another way.
    Regards,
    Thomas

    Here you go, this is the current version:
    CREATE OR REPLACE
    TRIGGER TRIGGER_TEST_HISTORY BEFORE UPDATE OR DELETE ON T_SUBTOPICS
    DECLARE
    var_subtopic_id NUMBER(6);
    var_old_schedule_date DATE;
    var_old_description VARCHAR2(1000);
    BEGIN
    /* Trigger soll Datensätze nach t_history kopieren, zusammen mit einer Beschreibung der Änderung!
    /* Datensätze aus Tabelle holen */
    SELECT subtopic_id, schedule_date, description INTO var_subtopic_id, var_old_schedule_date, var_old_description FROM t_subtopics;
    /* Abfragen, wie geändert wurde */
    IF UPDATING
    THEN
    INSERT INTO "PROJECT"."T_HISTORY" (subtopic_id, change_date, old_schedule_date, old_description, changes_id) VALUES (
    var_subtopic_id,
    sysdate,
    var_old_schedule_date,
    var_old_decription,
    '1');
    /* Oder gelöscht? */
    ELSIF DELETING
    THEN
    INSERT INTO "PROJECT"."T_HISTORY" (subtopic_id, change_date, old_schedule_date, old_description, changes_id) VALUES (
    var_subtopic_id,
    sysdate,
    var_old_schedule_date,
    var_old_decription,
    '2');
    END IF;
    END;
    Pretty primitive, but that was the first way that came into my mind.
    Edited spelling mistake
    Message was edited by:
    Thomas Anders

Maybe you are looking for