Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
1

Ошибка при создании Authentication Scheme

11.02.2016, 02:18. Показов 1122. Ответов 17
Метки нет (Все метки)

Доброго дня\вечера. Пытаюсь сделать собственный метод входа в приложение, созданию Authentication Scheme, функция имеет следующий вид
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 FUNCTION authenticate(username_in IN VARCHAR2
                                        ,password_in IN VARCHAR2) RETURN BOOLEAN IS
   l_value       NUMBER;
   l_returnvalue BOOLEAN;
 BEGIN
   BEGIN
     SELECT 1
       INTO l_value
       FROM users
      WHERE 1 = 1
        AND UPPER(users.username) = UPPER(username_in)
        AND UPPER(users.password) = UPPER(password_in);
   EXCEPTION
     WHEN no_data_found
          OR too_many_rows THEN
       l_value := 0;
     WHEN OTHERS THEN
       l_value := 0;
   END;
   l_returnvalue := l_value = 1;
   RETURN l_returnvalue;
 END;
таблица с пользователями:
Oracle 11 SQL
1
2
3
4
5
CREATE TABLE  "USERS" 
   (    "ID" NUMBER NOT NULL ENABLE, 
    "USERNAME" VARCHAR2(50) NOT NULL ENABLE, 
    "PASSWORD" VARCHAR2(50) NOT NULL ENABLE, 
     CONSTRAINT "USERS_PK" PRIMARY KEY ("ID") ENABLE
Но когда пытаюсь войти под любым пользователем, выводит ошибку :

1 error has occurred
ORA-06550: line 25, column 23: PLS-00306: wrong number or types of arguments in call to 'AUTHENTICATE' ORA-06550: line 25, column 1: PL/SQL: Statement ignored

С чем это связано, пыталась менять функции,всегда один результат. В чем проблема?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2016, 02:18
Ответы с готовыми решениями:

Ошибка при создании дескриптора окна при динамическом создании кнопок
public Form1() { InitializeComponent(); } int height = 10;...

Ошибка при подключении к бд: The server requested authentication method unknown to the client
При попытке связаться с бд выходит вот такое страшное сообщение: Fatal error: Uncaught...

При создании класса в проекте, после сборки появляется ошибка Ошибка HTTP 403.14 - Forbidden.
Сайт только начинаю делать. БД подключена, данные выводятся. При создании класса в проекте, после...

Где ошибка? (Задача в Scheme)
Реализуйте процедуру memoized-factorial для вычисления факториала по рекурсивной формуле с...

17
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 12:49 2
Насколько я знаю, тип BOOLEAN в Oracle имеет весьма ограниченное применение. Его можно использовать только внутри процедур и функций. На всякий случай я сделал бы функцию, которая возвращает NUMBER. Например, 1 для true и 0 для false. Думаю, что тогда все будет в порядке. Кроме того, у Вас идет два BEGIN подряд. Надеюсь, что это всего лишь опечатка в посте, иначе ошибка Oracle была бы другая

Добавлено через 5 минут
Да, действительно должно быть два BEGIN, и есть для них два END, Вы там ошибки обрабатываете во внутреннем блоке. Возвращайте просто l_value, сделайте RETURN NUMBER , и будет Вам счастье
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 13:13  [ТС] 3
Я создавала еще такую функцию
Oracle 11 SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE FUNCTION "USER_AUTH"
(p_user IN VARCHAR2 ,
p_pass IN VARCHAR2)
RETURN BOOLEAN
IS
l_count NUMBER;
BEGIN
SELECT COUNT(*) INTO l_count
FROM users
WHERE UPPER(username)=UPPER(p_user)
AND password=p_pass;
IF l_count >0 THEN RETURN TRUE;
ELSE RETURN FALSE;
END IF;
END USER_AUTH;
но при любых функциях из любых пособий один результат, меняла Authentication Function Name и с return, и с ;, всегда одна ошибка
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 13:32 4
Цитата Сообщение от Екатерина1619 Посмотреть сообщение
RETURN BOOLEAN
Так опять у Вас тип функции BOOLEAN
Попробуйте так
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE FUNCTION "USER_AUTH"
(p_user IN VARCHAR2 ,
p_pass IN VARCHAR2)
RETURN NUMBER
IS
l_count NUMBER;
BEGIN
SELECT COUNT(*) INTO l_count
FROM users
WHERE UPPER(username)=UPPER(p_user)
AND password=p_pass;
IF l_count >0 THEN RETURN 1;
ELSE RETURN 0;
END IF;
END USER_AUTH;
Должно работать. У меня аналог работает
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 13:37  [ТС] 5
та же ошибка, в Object Browser код функции сработал, но при запуске снова выдает тот же результат

ORA-06550: line 4, column 23: PLS-00306: wrong number or types of arguments in call to 'USER_AUTH' ORA-06550: line 4, column 1: PL/SQL: Statement ignored
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 13:51 6
У Вас все в Вашей схеме лежит, или Вы можете в нескольких схемах работать?
Можете прислать вызов функции, который возвращает такую ошибку?
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 13:56  [ТС] 7
новичок, не очень поняла, кроме самой функции и Authentication Function Name никуда не обращалась. "Вызов функции" где именно взять
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 14:02 8
Вы работаете в какой-то среде разработки (в какой?) или вызываете функцию в некой форме? Если в форме, то как соединяетесь к базе? Через строку соединения? ODBC, ADO или что-то еще?
Можете работать в SQL-Plus? Может как-то по другому называться, но, как правило, есть в клиенте.
Как Вы коннектитесь к базе? Вводите свой пароль-логин?
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 14:07  [ТС] 9
работаю Application Express 5.0.3.00.03, вся база тоже там, создала свое рабочее пространство и там все таблицы(если все правильно поняла вас)
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 14:29 10
Не знаком с такой штукой, к сожалению.
Попробуйте пропустить весь скрипт подряд. Внимание !!! В самый первый раз DROP пропускать не надо, потом можно. Что-то у Вас сохраняется непонятное в системе
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
DROP TABLE agk_test1;
 
CREATE TABLE agk_test1
   (username            VARCHAR2(50),
    userpsw             VARCHAR2(50));
 
INSERT INTO agk_test1
VALUES('AAAAAAA', '111111');
 
INSERT INTO agk_test1
VALUES('BBBBBBB', '222222');
 
INSERT INTO agk_test1
VALUES('CCCCCCC', '333333');
 
 
CREATE OR REPLACE FUNCTION agk_auth_test
    (p_user IN VARCHAR2,    p_pass IN VARCHAR2)
RETURN NUMBER
IS
    l_count NUMBER;
BEGIN
    SELECT COUNT(*) INTO l_count
    FROM agk_test1
    WHERE UPPER(username)=UPPER(p_user)
    AND userpsw=p_pass;
    IF l_count >0 THEN RETURN 1;
    ELSE RETURN 0;
    END IF;
END agk_auth_test;
 
SELECT a.username, b.userpsw, agk_auth_test(a.username, b.userpsw)
FROM agk_test1 a,
     agk_test1 b
;
Последний селект должен вернуть что-то в таком роде
Код
Row #	USERNAME	USERPSW	AGK_AUTH_TEST(A.USERNAME,B.USERPSW)
-----	--------	-------	-----------------------------------
1    	AAAAAAA 	111111 	1                                  
2    	BBBBBBB 	111111 	0                                  
3    	CCCCCCC 	111111 	0                                  
4    	AAAAAAA 	222222 	0                                  
5    	BBBBBBB 	222222 	1                                  
6    	CCCCCCC 	222222 	0                                  
7    	AAAAAAA 	333333 	0                                  
8    	BBBBBBB 	333333 	0                                  
9    	CCCCCCC 	333333 	1
Добавлено через 3 минуты
Добавлено через 10 минут
Использовал тэг code, чтобы было нормальное выравнивание. Но это, конечно, текст, а не код
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 14:31  [ТС] 11
все сработало, при запуске приложения apex абсолютно та же ошибка
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 14:35 12
Похоже у Вас сохраняются какие-то старые вызовы и варианты функций. А можно все убить и все создать заново?
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 14:37  [ТС] 13
удалила все функции, все старые таблицы, может я как-то не так вызываю саму функцию?
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 14:40 14
Если мой тестовый селект сработал, то значит такой вызов годится.
А как Вы вызываете функцию? Можете прислать код, в котором вызываете?
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 14:44  [ТС] 15
создала в apex Authentication Scheme, туда вношу название функции и именно отсюда лезут все ошибки
пыталась делать по этому уроку http://apex4.ru/apex-lessons/4-apex-lesson-4.html
0
Миниатюры
Ошибка при создании Authentication Scheme  
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
11.02.2016, 16:16 16
К сожалению, все, что я сказал, надо забыть как страшный сон. В Apex-е и функции могут быть BOOLEAN, и все что угодно. Так что надо возвращаться к булевским функциям.

Вообще же в Oracle тип BOOLEAN можно использовать в процедурном SQL в качестве переменных, но нельзя использовать в качестве полей таблиц и вызовов в операторе селект. Сейчас некоторые функции вроде бы можно использовать в условии WHERE. Я, правда, по старой памяти, стараюсь избегать булевских функций, где только можно их избегать.

Жалуются люди на Apex, на Вашу ошибку, но я так и не понял толком, как надо с ней бороться. Натыкался на совет вычистить кэш, но как это делать понятия не имею. Ваша ошибка "wrong number or types of arguments in call... " переводится как "ошибочное количество или типы аргументов в обращении к 'AUTHENTICATE' " , так что первое, что приходило в голову - это неврный вызов булевской функции.
Прошу прощения, что ввел Вас в заблуждение.
Напишите, если преодолеете Вашу проблему, наверняка это будет полезно многим.

Добавлено через 6 минут
Попробуйте погуглить "Custom Authentication in APEX" . Там в одной из первых ссылок я нашел один в один Вашу функцию authenticate. К сожалению, не специалист я в Апексе.
0
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 11
11.02.2016, 16:32  [ТС] 17
в любом случае спасибо за помощь, буду пытаться делать
0
759 / 660 / 195
Регистрация: 24.11.2015
Сообщений: 2,160
16.02.2016, 17:25 18
Я тут набрел на описание некоторых апексовых процедур в оракловой документации.
This procedure authenticates the user in the current session.
Login processing has the following steps:
Run authentication scheme's pre-authentication procedure.
Run authentication scheme's authentication function to check the user credentials (p_username, p_password), returning true on success.
If result=true: run post-authentication procedure.
If result=true: save username in session table.
If result=true: set redirect url to deep link.
If result=false: set redirect url to current page, with an error message in the notification_msg parameter.
Log authentication result.
Redirect.
Если я правильно перевожу это все, то надо как-то описать пре- и пост- аутентификационную процедуру (функцию???). Возможно, все Ваши проблемы из-за того, что она (они) не была определена. Может надо ее задать хотя бы самым тривиальным образом. Если это процедура, то
SQL
1
2
3
4
CREATE PROCEDURE post IS
BEGIN
    NULL;
END;
Если это функция, то
SQL
1
2
3
4
5
6
CREATE FUNCTION post 
RETURN BOOLEAN
IS
BEGIN
    RETURN 1=1;
END;
Это просто некое предположение
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2016, 17:25

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Ошибка при создании объекта. (При изменении цвета заполнения фигуры)
Дано: Adobe Flash CS3 Prof. Требуется программно изменить цвет заполнения нарисованной фигуры,...

Ошибка при импорте элементов при создании П/П в Altuim Designer 14
Помогите разобраться в Altuim designer 14 с ошибками при импорте элементов из схемы в ПП: unknown...

При подключении DLL: Ошибка при создании объекта из компоненты
Создана DLL. При попытке подключения из 1С получаем сообщение: Ошибка при создании объекта из...

Ошибка при создании БД
ошибка при создании БД как исправить


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.