Un procedimiento es un módulo de código escrito que debe construirse y guardarse en una base de datos sap hana. Para probar nuevas sintaxis se requiere soltar y recrear el procedimiento. Es posible evitar pasar por esos pasos para probar nuevos códigos añadidos a un procedimiento. El bloque anónimo permite ejecutar códigos de procedimiento en la interfaz SQL como si fuera un script SQL estándar. Actualizar y ejecutar una unidad de código es tan simple como ejecutar una consulta SQL.
Uso de Sap Hana Studio SQL Console
![](https://static.wixstatic.com/media/2592da_e4e95ed323314f4abafb393289fc4dbe~mv2.png/v1/fill/w_949,h_425,al_c,q_90,enc_avif,quality_auto/2592da_e4e95ed323314f4abafb393289fc4dbe~mv2.png)
Usando la sintaxis anonymous de bloques Sap hana.
Una estructura de procedimientos almacenada en sap hana está codificada con un encabezado, una instrucción start y end. Tiene que compilarse para ser ejecutado. Un bloque anónimo sap hana también está hecho de una declaración de comienzo y final como DO BEGIN ... FIN. Las variables se pueden declarar dentro de la sección inicial y final. El código lógico del procedimiento se escribe de la misma manera dentro del bloque anónimo. No es necesario cumplir con el bloqueo anónimo para ser ejecutado. Es simple: Resalte el código y ejecute.
-- Sap hana anonymous block syntax
--
-- begin and end statement
-- followed with variable declarations and any logical code syntaxes
-- -------------------------------------
-- ------------------------------------- syntax
DO
[ < named_parameters_list > ] [ ( < bound_parameter_clause > ) ]
BEGIN [ < block_properties > ]
< variable_declaration >
< statement_list >
END
Ejemplo de bloque anónimo Sap hana.
Esta sección muestra la lógica SQLScript dentro de un bloque anónimo. Para fines de prueba o para ejecutar pequeños bloques de script SQL lógico, no tiene que crear procedimientos o funciones persistentes. Los scripts SQL se pueden ejecutar desde cualquier base de datos donde, como procedimientos y funciones, deben crearse y guardarse en una base de datos para poder ejecutarse en esa misma base de datos. Crear nuevos objetos, como procedimientos, no siempre es posible en cierto entorno de base de datos. Ejecutar el bloqueo anónimo sería muy útil en ese contexto. Nota importante: Los bloques anónimos son tan convenientes y potentes que puede estar inclinado a ejecutarlo en producción. NO pruebe ni ejecute ningún código que altere los datos en ese contexto.
-- Simulating procedure syntaxes - working example (1)
-- -------------------------------------
-- using
-- using variables, cursor, loop, temporary table
-- Note : This is just a gathering of syntaxes, the final result has no particular meaning.
DO
BEGIN
DECLARE V_TB_CREATED INTEGER;
DECLARE V_TOTAL_ROW INTEGER;
DECLARE V_COUNT, V_FOR_CNT INTEGER;
DECLARE v_username VARCHAR(30);
DECLARE v_msg VARCHAR(200);
DECLARE v_sch_name VARCHAR(20);
DECLARE v_tb_name VARCHAR(200);
-- DECLARE ARRAY
---------------------------
declare v_arrnames varchar(32) array;
DECLARE v_dummy_schema_name VARCHAR(20);
DECLARE v_dummy_tb_name VARCHAR(200);
-- DECLARE CURSOR
---------------------------
DECLARE CURSOR vcurs_coltb FOR SELECT SCHEMA_NAME, TABLE_NAME FROM "SYS"."M_CS_TABLES" WHERE SCHEMA_NAME like 'SAP%' ORDER BY LAST_MERGE_TIME DESC;
-- CREATE TYPE VT_TYPE_SCHEMA as TABLE( SCHNAME varchar(20), COL_TB_CNT INTEGER, ROW_TB_CNT INTEGER):
-- USING TEMPORARY TABLE
---------------------------
V_TB_CREATED := 0;
select count(*) into V_TB_CREATED from TABLES where table_name='TMP_TBL_SCHEMA_DETAILS' and IS_TEMPORARY = 'TRUE';
IF (:V_TB_CREATED > 0) THEN
DROP TABLE "TMP_TBL_SCHEMA_DETAILS";
END IF;
CREATE GLOBAL TEMPORARY TABLE "TMP_TBL_SCHEMA_DETAILS" (SCH_NAME VARCHAR(20), TB_NAME varchar(200), COLTAB_CNT INTEGER, ROWTAB_CNT INTEGER);
-- USING CURSOR
---------------------------
V_COUNT = 1;
FOR cur_row as vcurs_coltb DO
v_sch_name := cur_row.SCHEMA_NAME;
v_tb_name := cur_row.TABLE_NAME;
if V_COUNT = 1 then
-- INSERTING INTO TMP TABLE
---------------------------
insert into TMP_TBL_SCHEMA_DETAILS values( :v_sch_name, :v_tb_name, 1, 1 );
end if;
V_COUNT = V_COUNT + 1;
END FOR;
-- USING FOR LOOP
---------------------------
FOR V_FOR_CNT in 1..10 DO
v_dummy_schema_name = 'dummy_schema_'||V_FOR_CNT;
v_dummy_tb_name = 'dummy_tb_name_'||V_FOR_CNT;
INSERT INTO TMP_TBL_SCHEMA_DETAILS VALUES (:v_dummy_schema_name,:v_dummy_tb_name, V_FOR_CNT, V_FOR_CNT + 10);
-- INSERT VALUE IN ARRAY
v_arrnames[:V_FOR_CNT] = ' ArrayName'||:V_FOR_CNT;
END FOR;
-- USING ARRAY
---------------------------
arrtb = UNNEST(:v_arrnames) AS (UNAME);
-- select * from :arrtb; -- query just like a table
-- USING ARRAY WITH A FOR LOOP
FOR V_FOR_CNT IN 1..CARDINALITY(:v_arrnames) DO
-- USING IF - ELSE
---------------------------
IF :V_FOR_CNT = 3 THEN
v_msg = 'message - level 3';
ELSE
v_msg = 'message - '||:V_FOR_CNT||' - '||'dummy data from array' ;
END IF;
-- INSERTING INTO TEMPORARY TABLE
---------------------------
INSERT INTO TMP_TBL_SCHEMA_DETAILS VALUES (:v_arrnames[V_FOR_CNT], v_msg, V_FOR_CNT, V_FOR_CNT + 10);
END FOR;
-- USING VARIABLE TABLE
---------------------------
t = SELECT * FROM TMP_TBL_SCHEMA_DETAILS;
SELECT COUNT(*) INTO V_TOTAL_ROW FROM :t;
select 'TOTAL SCHEMA tables: '||V_COUNT as c, SCH_NAME,
'First table : '||TB_NAME as Table_name,
'Total New col rows :'||COLTAB_CNT as TB_COLTOTAL_ROW,
'Total New row :'||ROWTAB_CNT as TB_ROWTOTAL_ROW
from TMP_TBL_SCHEMA_DETAILS;
END;
-- ------------------------------------- working example (2)
-- To simulate a simple SQL Script
DO BEGIN
-- DECLARING VARIABLES
DECLARE V_MEMORY_LIMIT number;
DECLARE V_DBNAME varchar(20);
-- ASSIGN VALUE TO VARIABLES
select database_name into V_DBNAME from "SYS"."M_DATABASES";
SELECT round(ALLOCATION_LIMIT/1024/1024/1024,0) into V_MEMORY_LIMIT FROM PUBLIC.M_HOST_RESOURCE_UTILIZATION;
-- EXECUTE SQL SUBQUERY
select week_no,
date_,
TO_CHAR(date_, 'MON-DD, Dy') as day_,
V_DBNAME as DB,
LOWEST_USED_MEMORY_TODAY as LOW_GB,
PEAK_USED_MEMORY_TODAY as HIGH_GB,
USED_MEMORY_PERC||'%' as PEAK,
Db_Memory_allocation as Allocat,
case
when (PEAK_USED_MEMORY_TODAY - LOWEST_USED_MEMORY_TODAY) > 200
then
'Alert '||(PEAK_USED_MEMORY_TODAY - LOWEST_USED_MEMORY_TODAY)||' GB of memory has been used today.'
else
''
end m_alert_1,
case
when USED_MEMORY_PERC > 80
then
'Alert - Peak Memory use is reaching '||USED_MEMORY_PERC||'% of the total memory allocation.'
else
''
end m_alert_2
from (
select Week(SNAPSHOT_ID) as week_no,
TO_CHAR(SNAPSHOT_ID, 'YYYY-MM-DD') as date_,
MIN(RTRIM(round(INSTANCE_TOTAL_MEMORY_USED_SIZE/1024/1024/1024),0)) as LOWEST_USED_MEMORY_TODAY,
MAX(RTRIM(round(INSTANCE_TOTAL_MEMORY_USED_SIZE/1024/1024/1024),0)) as PEAK_USED_MEMORY_TODAY,
round((MAX(RTRIM(round(INSTANCE_TOTAL_MEMORY_USED_SIZE/1024/1024/1024),0))/:V_MEMORY_LIMIT)*100,0) as USED_MEMORY_PERC,
V_MEMORY_LIMIT as Db_Memory_allocation
from _SYS_STATISTICS.HOST_RESOURCE_UTILIZATION_STATISTICS
group by TO_CHAR(SNAPSHOT_ID, 'YYYY-MM-DD'), Week(SNAPSHOT_ID)
)
order by 1 desc, 2 desc;
END
-- -------------------------------------
-- ------------------------------------- to execute
In hana studio SQL console
Highlight the overall script
Execute
Resultado de ejecución anónimo usando la consola SQL de hana studio:
![](https://static.wixstatic.com/media/2592da_9eb5795b3b06430fa15beb2bc48b38cf~mv2.png/v1/fill/w_717,h_404,al_c,q_85,enc_avif,quality_auto/2592da_9eb5795b3b06430fa15beb2bc48b38cf~mv2.png)
¿Ejecutar la sintaxis del procedimiento sap hana sin crear una función o un procedimiento?
SAP HANA SQL Script se puede ejecutar fuera de la estructura de procedimientos utilizando lo que se llama bloque anónimo. Se define con la sintaxis "Comenzar" y "Finalizar". Las instrucciones DML se ejecutarán sin necesidad de una estructura de procedimientos almacenados. La sección o parte del procedimiento SQL se puede probar fácilmente antes de incluir la sintaxis del código dentro de una función verdadera o un procedimiento almacenado.
![](https://static.wixstatic.com/media/2592da_f9ed6711895c4b7480d44cded580a579~mv2.png/v1/fill/w_665,h_203,al_c,q_85,enc_avif,quality_auto/2592da_f9ed6711895c4b7480d44cded580a579~mv2.png)
Bloque anónimo Sap hana en comparación con el procedimiento almacenado
Los siguientes ejemplos muestran el uso de savia hana bloqueo anónimo en comparación con un procedimiento. Muestra la sintaxis del procedimiento en primer lugar y en segundo lugar muestra cómo se puede probar parte del código del procedimiento en el bloque anónimo. El bloque anónimo se ejecuta de la misma manera que una consulta SQL. Cualquier actualización lógica de errores o códigos se puede probar inmediatamente en el bloque anónimo sap hana.
----- Example 1. ----- In the first place the procedure to be tested CREATE PROCEDURE "ADMIN_USER"."CREATE_USER" () LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS BEGIN /* Define and group all variables ==================================*/ DECLARE LV_USER_ID Integer; DECLARE LV_USERNAME varchar(20) := 'BACKUP_USER'; DECLARE LV_USERPASS varchar(20) := 'TopSecret01'; DECLARE LV_CREATEUSERSQL varchar(200); /* assign values to variables ==================================*/ LV_USER_ID := 1; LV_USERNAME := LV_USERNAME||to_varchar(LV_USER_ID); LV_CREATEUSERSQL := 'CREATE USER '||LV_USERNAME||' PASSWORD '||LV_USERPASS; EXEC(:LV_CREATEUSERSQL); SELECT 'User : '||LV_USERNAME||' has been created.' FROM DUMMY; END;
----- On the other hand, the same procedure code in an Anonymous Block. ----- This will avoid re-creating the procedure each time it has to be tested. DO BEGIN /* Define and group all variables ==================================*/ DECLARE LV_USER_ID Integer; DECLARE LV_USERNAME varchar(20) := 'BACKUP_USER'; DECLARE LV_USERPASS varchar(20) := 'TopSecret01'; DECLARE LV_CREATEUSERSQL varchar(200); /* assign values to variables ==================================*/ LV_USER_ID := 1; LV_USERNAME := LV_USERNAME||to_varchar(LV_USER_ID); LV_CREATEUSERSQL := 'CREATE USER '||LV_USERNAME||' PASSWORD '||LV_USERPASS; EXEC(:LV_CREATEUSERSQL); SELECT 'User : '||LV_USERNAME||' has been created.' FROM DUMMY; END;
------ example 2 ------- A procedure with no parameter CREATE SCHEMA MYTOOLS; DROP Procedure "MYTOOLS"."ShowLockUsers"; Create Procedure "MYTOOLS"."ShowLockUsers"() Language SQLScript as Begin DECLARE V_DBNAME varchar(20); SELECT database_name into V_DBNAME from "SYS"."M_DATABASES"; select V_DBNAME as DB_NAME, user_name, valid_from, invalid_connect_attempts, last_invalid_connect_attempt from users where invalid_connect_attempts > 5 order by user_name desc; End; -- -- The procedure can be executed with hdbsql as well as within sap hana studio Sql console -- hdbsql> CALL "MYTOOLS"."ShowLockUsers"(); | DB_NAME | USER_ | VALID_FROM | INVALID_CONNECT_AT | LAST_INVALID_CONNE | | ------- | ----- | ----------------------------- | ------------------------- | ----------------------------- | | TUX01 | DUMMY | 2019-02-13 15:10:43.824000000 | 8 | 2019-11-07 15:07:55.441000000 |
----- the previous procedure code in an Anonymous Block. ----- ----- Note : Cannot be run using hdbsql DO BEGIN DECLARE V_DBNAME varchar(20); SELECT database_name into V_DBNAME from "SYS"."M_DATABASES"; select V_DBNAME as DB_NAME, user_name, valid_from, invalid_connect_attempts, last_invalid_connect_attempt from users where invalid_connect_attempts > 5 order by user_name desc; END;
Comments