Home > Mobile >  function does not exist error in PostgreSQL
function does not exist error in PostgreSQL

Time:08-24

I'm writing procedure in PostgreSQL While writing am getting error for FN_GETCD like function fn_getcd(integer) does not exist IS THE NEW VALUE but i have written function for fn_getcd like this

   CREATE OR REPLACE FUNCTION public.fn_getcd(
        v_entity_num text)
        RETURNS timestamp without time zone
        LANGUAGE 'plpgsql'
        COST 100
        STABLE SECURITY DEFINER PARALLEL UNSAFE
    AS $BODY$
  

    DECLARE
    
        O_CBD timestamp;
    
    BEGIN
        SELECT
          TO_DATE(TO_CHAR(clock_timestamp(),'DD-MON-YYYY'),'DD-MON-YYYY')
        INTO STRICT
          O_CBD
    ;
        RETURN O_CBD;
      EXCEPTION
      WHEN OTHERS THEN
        RETURN O_CBD;
      END;
    $BODY$;

please help me to solve this error

 tocheck :=cast(P_ENTITY_CODE as TEXT);
  RAISE NOTICE 'GOT HERE tocheck :% IS THE NEW VALUE',tocheck;
         EXECUTE 'INSERT INTO BENMASTHIST SELECT BENMAST_ENTITY_CODE, BENMAST_CUSTOMER_CODE, BENMAST_BEN_CODE,
                      FN_GETCD(' ||
                              tocheck || '),' || W_BEN_HIST_SL ||
                              ', BENMAST_NAME, BENMAST_MOBILE_NO,
                      BENMAST_EMAIL_ID, BENMAST_PHOTO, BENMAST_SOURCE, BENMAST_CR_BY, BENMAST_CR_ON,
                      BENMAST_MO_BY, BENMAST_MO_ON, BENMAST_AU_BY, BENMAST_AU_ON, TBA_KEY,BENMAST_FROM
                      FROM BENMAST WHERE BENMAST_ENTITY_CODE =$1 AND BENMAST_CUSTOMER_CODE =$2 AND BENMAST_BEN_CODE =$3'
              USING P_ENTITY_CODE, P_CUST_CODE, P_BEN_CODE;
-- RAISE NOTICE 'GOT HERE BENMASTHIST :% IS THE NEW VALUE',BENMASTHIST;
              
          EXCEPTION
            WHEN UNIQUE_VIOLATION THEN
              P_SUC_FLAG := 'S';
            WHEN OTHERS THEN
            ---    DBMS_OUTPUT.put_line(SQLERRM);
              P_SUC_FLAG := 'F';
               P_ERROR    := SQLERRM;
              RAISE NOTICE 'SQLERRM :% IS THE NEW VALUE',SQLERRM;
              P_ERROR    := 'BENREG013'; --'Error While Inserting Into Benmast';
            --  ROLLBACK;
          END;

CodePudding user response:

reference: dollar quote: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING

Sometimes you don't know how much quote you need.You can first compose the string then do the execute command.

a horse already said that you function can be as simple as return current_date::timestamp;

If you add more quote then you function will work.

DO $$
DECLARE
    _vstr text := 'test';
    _vtime timestamp;
    _sql text;
    _sql1 text;
    _sql0 text;
BEGIN
    _sql := ' select fn_getcd( ' || '''' || _vstr || '''' || ' )';
    _sql1 := ' select fn_getcd( ' || $a$ '$a$ || _vstr  || $b$' $b$ || ' )';
    _sql0 := ' select fn_getcd( ' || _vstr || ' )';
    RAISE NOTICE '_sql is %', _sql;
    RAISE NOTICE '_sql1 is %', _sql1;
    RAISE NOTICE '_sql1 is %', _sql0;
    EXECUTE _sql INTO _vtime;
    RAISE NOTICE 'v_time is % ', _vtime;
END
$$
LANGUAGE plpgsql;

You string is like _sql0 format. You need use dollar quote or simple put more single quote in it. (_sql or _sql1).

  • Related