Search code examples
djangodatabaseoraclestored-proceduresplsql

PLS-00201 identifier 'PACKAGENAME.PROCEDURENAME' must be declared


iam working on the Backend of a Chat System, used whit Django Server. I wrote an procedure in SQL-Developer for the Oracle Database, which should provide the recent messages to an endpoint. When i run the Procedure in SQL-Developer it goes smoothly. But if i run the Procedure in the endpoint, there is following Error-Message:

b'{"ERROR_NO": 6550, "ERROR_MSG": "ORA-06550: line 1, column 7:\\nPLS-00201: identifier \'P_CHAT.GET_MESSAGES\' must be declared\\nORA-06550: line 1, column 7:\\nPL/SQL: Statement ignored\\n"}'

Views.py

    #getmessage
@need_get_parameters([PARAM_SENDING_USER_ID, PARAM_LAST_ID])
def get(self, request, *args, **kwargs):
    uid = request.GET.get(PARAM_SENDING_USER_ID)
    last_id = request.GET.get(PARAM_LAST_ID)

    #ToDo validate Data
    try:
        params = {"i_lastId": last_id}
        results = db_execute_procedure_ajax_response("p_chat.get_messages", params, uid)
        return HttpResponse(json.dumps(results))

    except Exception as a:
        return HttpResponse(error_json(ERR_MSG_NO_RECENT_MESSAGE))

Selfmade db.py Method (Works on all the other Endpoints)

@trace_db_ajax def db_execute_procedure_ajax_response(procedure_name, params, uid): params["o_data"] = {"type": cx_Oracle.CLOB} try: rparams = db_execute_procedure_lro(procedure_name, params, uid) except DBExecuteLogicalException as e: return ajax_response_bad_request(error_response(e.error_code, e.error_msg, e.error_info)) except DBExecutePhysicalException as e: return ajax_response_server_error(error_response(e.error_code, e.error_msg)) return ajax_response(rparams["o_data"])

Procedure

create or replace PACKAGE BODY P_CHAT AS
PROCEDURE get_messages
(
    i_userId    in   number,
    i_lastId    in   number,
    o_retCode   out  number,
    o_json      out  clob
)IS
    m_retCode   number := STD_C.retCode_ok;
BEGIN
    apex_json.initialize_clob_output;
    apex_json.open_array();
    if i_userId IS NULL then
        m_retCode := STD.error(P_C.ERR_USER_ID_MISSING);
    else
        for cs in(
            SELECT id, message, sender_id, gendate
            FROM Message
            WHERE (id>i_lastId OR i_lastId IS NULL)
            AND RECEIVER_ID=i_userId) loop
                apex_json.open_object();
                apex_json.write(P_C.JSON_MSG_ID, cs.id);
                apex_json.write(P_C.JSON_MSG_MESSAGE, cs.message);
                apex_json.write(P_C.JSON_MSG_SENDER_ID, cs.sender_id);
                apex_json.write(P_C.JSON_MSG_GENDATE, cs.gendate, std_c.iso_date_format);
                apex_json.close_object;
            end loop;
        apex_json.close_array();
        o_json := apex_json.get_clob_output;
    end if;

    o_retCode := m_retCode;

END get_messages;

END P_CHAT;

I dont have to declare the Procedure name in the Procedure or?

Thanks for your answers!


Solution

  • PLS-00201: identifier must be declared means either

    1. It really doesn't exist, or
    2. It exists but the caller does not have privileges to execute it, or
    3. It exists in some schema other than the caller's default, and the caller needs to specify which one.

    In the case of #2, you need to grant execute permission on the package to the caller (or to a role which the caller has).

    In the case of #3, you need to either specify the schema, or set that as your default schema for the session, or create a synonym.