【问题标题】:PGSql No function matches the given name and argument types. You might need to add explicit type castsPGSql 没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换
【发布时间】:2021-02-05 04:12:12
【问题描述】:

所以,我正在将数据库从 Oracle 迁移到 PGSql 项目,现在我正在修复一些查询。 我遇到了这样的错误:

Caused by: org.postgresql.util.PSQLException: ERROR: function nvl(timestamp without time zone, timestamp with time zone) does not exist
  Hint: No function matches the given name and argument types. You might need to add explicit type casts.

我在这个字符串生成器的控制台中发现了 nvl 错误

    public List<InsEmployeeInfoVo> load(int first, int pageSize,
            String sortField, SortOrder sortOrder, SearchFilter searchFilter) {
        SQLQuery query = null;

        try {
            StringBuilder sqlQuery = new StringBuilder();
            sqlQuery.append(" select ");
            sqlQuery.append("     pts.PERSON_TRAN_SING_ID, ");
            sqlQuery.append("     ext.INTERNALID PERSON_EXT_ID, ");
            sqlQuery.append("     people.internalid PERSON_ID, ");
            sqlQuery.append("     people.EMPLOYEE_NUMBER NIK, ");
            sqlQuery.append("     people.PER_INFORMATION1 PERSON_NAME, ");
            sqlQuery.append("     case ");
            sqlQuery.append("         when pts.INS_MEMBER_NO is not null ");
            sqlQuery.append("         then pts.INS_MEMBER_NO ");
            sqlQuery.append("         else ext.INS_MEMBER_NO ");
            sqlQuery.append("     end INS_MEMBER_NO, ");
            sqlQuery.append("     case ");
            sqlQuery.append("         when pts.INS_TOTAL_COVER is not null ");
            sqlQuery.append("         then pts.INS_TOTAL_COVER ");
            sqlQuery.append("         else ext.INS_TOTAL_COVER ");
            sqlQuery.append("     end INS_TOTAL_COVER, ");
            sqlQuery.append("     null INS_PLAN_NAME, ");
            sqlQuery.append("     case ");
            sqlQuery.append("         when pts.INS_BH_CARD_NO is not null ");
            sqlQuery.append("         then pts.INS_BH_CARD_NO ");
            sqlQuery.append("         else ext.INS_BH_CARD_NO ");
            sqlQuery.append("     end INS_BH_CARD_NO, ");
            sqlQuery.append("     case ");
            sqlQuery.append("         when pts.INS_BH_TOTAL_COVER is not null ");
            sqlQuery.append("         then pts.INS_BH_TOTAL_COVER ");
            sqlQuery.append("         else ext.INS_BH_TOTAL_COVER ");
            sqlQuery.append("     end INS_BH_TOTAL_COVER, ");
            sqlQuery.append("   null INS_BH_PLAN_NAME, ");
            sqlQuery.append("     pts.PROCESS_STATUS PROCESS_STATUS, ");
            sqlQuery.append("     BTPN_INS_F_GET_CHECKER (people.internalid,:singSourceType,1) PROCESS_STATUS_NAME, ");
            sqlQuery.append("     pts2.PERSON_TRAN_SING_ID PERSON_TRAN_SING_ID_2, ");
            sqlQuery.append("     pts2.PROCESS_STATUS PROCESS_STATUS_2, ");
            sqlQuery.append("     upl.PERSON_DATA_UPL_DTL_ID, ");
            sqlQuery.append("     upl.PROCESS_STATUS PROCESS_STATUS_UPLOAD, ");
            sqlQuery.append("     NVL(pts.UPDATE_ON, pts.CREATE_ON) INPUT_DATE, ");
            sqlQuery.append("     BTPN_INS_F_GET_CHECKER (people.internalid,:singSourceType,2) NOTE_APPROVE, pts.NOTE ");
            sqlQuery.append(" from WOT_PEOPLE people ");
            sqlQuery.append("     inner join WOT_ASSIGNMENT assign ");
            sqlQuery.append("         on assign.PERSON_ID = people.internalid ");
            sqlQuery.append("         and assign.PRIMARY_FLAG = 'Y' ");
            sqlQuery.append("         and (date_trunc('day', now()) between assign.EFFECTIVE_START_DATE and assign.EFFECTIVE_END_DATE) ");
            sqlQuery.append("     left join BTPN_INS_PEOPLE_EXT ext ");
            sqlQuery.append("         on ext.PERSON_ID = people.internalid ");
            sqlQuery.append("         and date_trunc('day', now()) between ext.EFFECTIVE_START_DATE and NVL(ext.EFFECTIVE_END_DATE, now()) ");
            

我认为最后一个 NVL 变量有问题,但我不确定,我通常不使用这个本机查询,而且我在 PGSql 中也是新的

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    您可以尝试使用 PostgreSQL COALESCE function(参见 9.17.2. COALESCE 部分)代替 oracle NVL function

    【讨论】:

    • 。 . COALESCE() 不是“Postgres”函数。它是标准 SQL,我建议在包括 Oracle 在内的所有数据库中使用它。
    • 我只是找到 NVL 并替换为 COALESCE ,它就可以了!谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多