Как получить имя параметра, тип и значение по умолчанию тела функции Oracle PLSQL?Python

Программы на Python
Ответить
Anonymous
 Как получить имя параметра, тип и значение по умолчанию тела функции Oracle PLSQL?

Сообщение Anonymous »

У меня есть следующий код PLSQL, который я обрабатываю с помощью Antlr4 на Python. У меня возникли проблемы с извлечением имени параметра функции и связанных с ним деталей.

Код: Выделить всё

CREATE OR REPLACE
FUNCTION getcost ( p_prod_id IN VARCHAR2 , p_date IN DATE) RETURN number AS
Вывод ParseTree для этого:

Код: Выделить всё

╚═ sql_script
╠═ unit_statement
║  ╚═ create_function_body
║     ╠═ "CREATE" (CREATE)
║     ╠═ "OR" (OR)
║     ╠═ "REPLACE" (REPLACE)
║     ╠═ "FUNCTION" (FUNCTION)
║     ╠═ function_name
║     ║  ╚═ identifier
║     ║     ╚═ id_expression
║     ║        ╚═ regular_id
║     ║           ╚═ "getcost" (REGULAR_ID)
║     ╠═ "(" (LEFT_PAREN)
║     ╠═ parameter
║     ║  ╠═ parameter_name
║     ║  ║  ╚═ identifier
║     ║  ║     ╚═ id_expression
║     ║  ║        ╚═ regular_id
║     ║  ║           ╚═ "p_prod_id" (REGULAR_ID)
║     ║  ╠═ "IN" (IN)
║     ║  ╚═ type_spec
║     ║     ╚═ datatype
║     ║        ╚═ native_datatype_element
║     ║           ╚═ "VARCHAR2" (VARCHAR2)
║     ╠═ "," (COMMA)
║     ╠═ parameter
║     ║  ╠═ parameter_name
║     ║  ║  ╚═ identifier
║     ║  ║     ╚═ id_expression
║     ║  ║        ╚═ regular_id
║     ║  ║           ╚═ "p_date" (REGULAR_ID)
║     ║  ╠═ "IN" (IN)
║     ║  ╚═ type_spec
║     ║     ╚═ datatype
║     ║        ╚═ native_datatype_element
║     ║           ╚═ "DATE" (DATE)
║     ╠═ ")" (RIGHT_PAREN)
║     ╠═ "RETURN" (RETURN)
║     ╠═ type_spec
║     ║  ╚═ datatype
║     ║     ╚═ native_datatype_element
║     ║        ╚═ "number" (NUMBER)
║
Код Python:

Код: Выделить всё

        def enterParameter(self, ctx:PlSqlParser.ParameterContext):

print(ctx.toStringTree(recog=parser))

param_name = None
if ctx.parameter_name:
if ctx.parameter_name.identifier() and ctx.parameter_name.identifier().id_expression():
param_name = ctx.parameter_name.identifier().id_expression().regular_id().getText()

param_type = None
if ctx.type_spec and ctx.type_spec.datatype:
if ctx.type_spec.datatype.native_datatype_element():
param_type = ctx.type_spec.datatype.native_datatype_element().getText()

default_value = None

print(f"Parameter: {param_name}, Type: {param_type}, Def: {default_value}")
Вывод оператора печати:

Код: Выделить всё

(parameter (parameter_name (identifier (id_expression (regular_id p_prod_id)))) IN (type_spec (datatype (native_datatype_element VARCHAR2))))

Но я получаю следующую ошибку:

Код: Выделить всё

    if ctx.parameter_name.identifier() and ctx.parameter_name.identifier().id_expression():
AttributeError: 'function' object has no attribute 'identifier'
Если я использую ctx.getChild(0).getText() для получения имени параметра, это работает, но я не хочу полагаться на жестко закодированные индексы, и я также не понимаю, почему это не работает.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ction-body
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»