Cannot comment yet, but this is an extended version of what @greg p's query above. Might need to add the other fields if using different variable types/languages/etc.
CREATE OR REPLACE PROCEDURE EDW.PROC.GET_HUMAN_READABLE_PROCEDURE("P_FULLY_QUALIFIED_PROCEDURE_NAME" TEXT)
RETURNS TEXT
LANGUAGE SQL
EXECUTE AS OWNER
AS
DECLARE
final_ddl TEXT;
BEGIN
let db TEXT:= (split_part(P_FULLY_QUALIFIED_PROCEDURE_NAME,'.',1));
let schema_ TEXT:=(split_part(P_FULLY_QUALIFIED_PROCEDURE_NAME,'.',2));
let proc_name TEXT:=(split_part(P_FULLY_QUALIFIED_PROCEDURE_NAME,'.',3));
let info_schema_table TEXT:=(CONCAT(:db, UPPER('.information_schema.procedures')));
SELECT
'CREATE OR REPLACE PROCEDURE '||:P_FULLY_QUALIFIED_PROCEDURE_NAME||ARGUMENT_SIGNATURE||CHAR(13)
||'RETURNS '||DATA_TYPE||CHAR(13)
||'LANGUAGE '||PROCEDURE_LANGUAGE||CHAR(13)
||'EXECUTE AS OWNER'||CHAR(13)
||'AS '||CHAR(13)||PROCEDURE_DEFINITION||';'
INTO :final_ddl
FROM identifier(:info_schema_table)
WHERE PROCEDURE_SCHEMA=:schema_
AND PROCEDURE_NAME=:proc_name;
RETURN :final_ddl;
END;