2016-05-03 2 views
1

Я создал эту процедуру, которая извлекает все процедуры в базе данных, генерирует документ (через комментарии) и перечисляет все параметры «in» и «out» - это прекрасно, он отлично работает!SQL Anywhere Условный оператор выбора

Проблема, с которой я сталкиваюсь, заключается в том, что в приложении, которое я создаю, я хочу выбрать ОДИН из этих процедур (поэтому, когда пользователь нажимает на один из элементов из этого списка) и выводит его данные (создание второй процедуры чтобы справиться с этим не вариант)

Вот исходный код (игнорировать р ***** - это скрытый от цели (но никогда не используется в процедуре - его для регистрации)):

ALTER PROCEDURE "USER"."NetDefineProcs" 
/* DOC 
    Everything between the DOC tags are used to generate the user document. 
*/ 
(in "p*****" char(20), in "pSearchTerm" long varchar, in "pSelectOne" char(1) default null) 
result("proccessName" long varchar, "Doc" long varchar, "paramName" long varchar,"paramIO" long varchar,"paramDefault" long  varchar,"paramType" long varchar) 
begin 
    SELECT "proc_name" as "proccessName", 
    (SELECT substr(source, charindex('/* DOC', source)+6, charindex('*/', source) - charindex('/* DOC', source)-6) FROM  "sys"."sysprocedure" where "proc_name" = "proccessName" AND charindex('/* DOC', source) > 0) as "Doc", 
    "LIST"("parm_name" order by "parm_type" asc,"parm_id" asc) as "paramName", 
    "LIST"("parm_type" order by "parm_type" asc,"parm_id" asc) as "paramIO", 
    "LIST"("isnull"("default",'null') order by "parm_type" asc,"parm_id" asc) as "paramDefault", 
    "LIST"("isnull"("domain_name",'null') order by "parm_type" asc,"parm_id" asc) as "paramType" 
    from "sys"."sysprocedure" as "pr" key join "SYS"."SYSPROCPARM" as "pa" key join "SYS"."SYSDOMAIN" 
    -- Below code requires sybase 16 - temporary version 11 friendly version above 
    -- "LIST"("isnull"("base_type_str",'null') order by "parm_type" asc,"parm_id" asc) as "paramType" 
    -- from "sys"."sysprocedure" as "pr" key join "SYS"."SYSPROCPARM" as "pa" --where pr.proc_name = o.proc_name ; 
    -- WHERE "proc_name" like 'net%' AND "proc_name" like '%' + pSearchTerm + '%' 

    WHERE "proc_name" = pSearchTerm OR "proc_name" like 'net%' AND "proc_name" like '%' + pSearchTerm + '%' 

    group by "proc_name" 
    order by 1 asc 
end 

В приведенном выше коде прекрасно работает для извлечения всех из них, теперь вот код, который я написал, чтобы попытаться извлечь только ОДИН

ALTER PROCEDURE "USER"."NetDefineProcs" 
/* DOC 
    Everything between the DOC tags are used to generate the user document. 
*/ 
(in "p*****" char(20), char(20), in "pSearchTerm" long varchar, in "pSelectOne" char(1) default null) 
result("proccessName" long varchar, "Doc" long varchar, "paramName" long varchar,"paramIO" long varchar,"paramDefault" long varchar,"paramType" long varchar) 
begin 

    CASE 
     WHEN pSelectOne = '1' THEN SELECT FIRST "proc_name" as "proccessName", 
     ELSE SELECT "proc_name" as "proccessName", 
    END 

    (SELECT substr(source, charindex('/* DOC', source)+6, charindex('*/', source) - charindex('/* DOC', source)-6) FROM "sys"."sysprocedure" where "proc_name" = "proccessName" AND charindex('/* DOC', source) > 0) as "Doc", 
    "LIST"("parm_name" order by "parm_type" asc,"parm_id" asc) as "paramName", 
    "LIST"("parm_type" order by "parm_type" asc,"parm_id" asc) as "paramIO", 
    "LIST"("isnull"("default",'null') order by "parm_type" asc,"parm_id" asc) as "paramDefault", 
    "LIST"("isnull"("domain_name",'null') order by "parm_type" asc,"parm_id" asc) as "paramType" 
    from "sys"."sysprocedure" as "pr" key join "SYS"."SYSPROCPARM" as "pa" key join "SYS"."SYSDOMAIN" 
    -- Below code requires sybase 16 - temporary version 11 friendly version above 
    -- "LIST"("isnull"("base_type_str",'null') order by "parm_type" asc,"parm_id" asc) as "paramType" 
    -- from "sys"."sysprocedure" as "pr" key join "SYS"."SYSPROCPARM" as "pa" --where pr.proc_name = o.proc_name ; 
    -- WHERE "proc_name" like 'net%' AND "proc_name" like '%' + pSearchTerm + '%' 

    WHERE "proc_name" = pSearchTerm OR "proc_name" like 'net%' AND "proc_name" like '%' + pSearchTerm + '%' 

    group by "proc_name" 
    order by 1 asc 
end 

Теперь я знаю, что есть синтаксическая ошибка из-за операторов выбора, имеющих конечный ',', но есть ли способ, которым я могу иметь что-то похожее на то, что я пытаюсь достичь, без того, что он становится грязным?

+0

Есть ли причина, по которой вы не можете программно выбрать подходящую хранимую процедуру со своего уровня приложения? –

+0

его предпочтительнее, если он выбран через базу данных (это nodejs, и я изучаю, как я иду!) – Gaza

+0

решил это. мой ответ ниже – Gaza

ответ

0

Решено!

Добавлено это к "в" Params

in "pSelectOne" char(1) default null 

и изменил ИНЕКЕ

WHERE (pSelectOne IS NOT NULL and "proc_name" = pSearchTerm) or (pSelectOne IS NULL and "proc_name" like 'net%' AND "proc_name" like '%' + pSearchTerm + '%') 

и она работает.

Смежные вопросы