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!
PLS-00201: identifier must be declared
means either
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.