【问题标题】:is there a way to avoid 'column not allowed here' error when inserting rows插入行时有没有办法避免“此处不允许列”错误
【发布时间】:2021-10-19 21:22:28
【问题描述】:

所以我正在制作一个在这种情况下生成收据编号的表格:

  1. 如果账户类型是 Home Loan,前 2 个字母应该是“HL”,如果是学生贷款,前 2 个字母应该是“SL”
  2. 接下来的 2 个字母应该来自姓氏,并从左边用 0 填充 这是我插入行时的代码和错误:
insert into processedaccounts
values (30, (substr(accounttype,1,2) || (lastname,1,2) || RPAD(receiptnumber_seq.nextval9,'0')), 'Metropolis', 'Home Loan', 'Adam', 'Smith');

错误报告 - SQL 错误:ORA-00984:此处不允许列

  1. 00000 - “此处不允许列”

我应该如何修改我的查询以避免“此处不允许列”错误

【问题讨论】:

  • processedaccounts 表中有哪些列?
  • 您如何获取 accounttype、lastname 和receiptnumber_seq 的值。它们不是从您查询中的任何表中引用的
  • 列是requestid、receipt number、city、account type、firstname和lastname
  • 哦,对了,我忘记了参考表。参考表请求帐户有列:请求 ID、帐户类型、名字和姓氏

标签: sql oracle11g


【解决方案1】:

在您的查询中:

  • 账户类型的substr函数错误,你应该得到第一个字符和空格后的第一个字符
  • RPAD 功能错误
  • 姓氏没有 substr 函数
  • 参考表丢失
  • 应从参考表中选择值

我已更正它们,这是最终查询,根据您的要求更改表和列名称

insert into processedaccounts
select  requestid,
        substr(account_type,1,1)||SUBSTR(account_type, Instr(account_type, ' ', 1, 1) +1,1) || substr(lastname,1,2) || RPAD(receiptnumber2.nextval,9,0) ,
        city, 
        account_type,
        firstname,
        lastname
from request_accounts
where request_accounts.requestid = 30;

【讨论】:

    【解决方案2】:

    您不能引用accounttypelastname,因为您不是SELECTing 一行,而是CREATEing 一个新行。您将需要改用文字:

    insert into processedaccounts (
      requestid,
      receiptnumber,
      city,
      accounttype,
      firstname,
      lastname
    ) values (
      30, 
      'HL' || 'SM' || RPAD(receiptnumber_seq.nextval, 9, '0'),
      'Metropolis',
      'Home Loan',
      'Adam',
      'Smith'
    );
    

    如果您从表中获取值,那么:

    insert into processedaccounts (
      requestid,
      receiptnumber,
      city,
      accounttype,
      firstname,
      lastname
    ) 
    SELECT requestid, 
           CASE accounttype
           WHEN 'Home Loan' THEN 'HL'
           WHEN 'Student Loan' THEN 'SL'
           END
           || UPPER(SUBSTR(lastname, 1, 2))
           || RPAD(receiptnumber_seq.nextval, 9, '0'),
           'Metropolis',
           accounttype,
           firstname,
           lastname
    FROM   requestaccounts
    WHERE  somecondition = something;
    

    【讨论】:

      【解决方案3】:

      您的 RPAD 函数构造不正确。函数格式为:

      RPAD( string1, padded_length [, pad_string] )
      

      【讨论】:

        猜你喜欢
        • 2014-01-10
        • 1970-01-01
        • 1970-01-01
        • 2020-03-31
        • 1970-01-01
        • 2021-12-15
        • 1970-01-01
        • 2019-09-07
        • 1970-01-01
        相关资源
        最近更新 更多