Skip to main content

RFC Metadata Extraction

This advanced guide covers RFC metadata extraction and analysis using ERPL's RFC functions. Learn how to discover SAP functions, analyze table structures, and build dynamic integration patterns — using the real output columns of each function.

For SAP Developers and Integration Specialists

This guide is designed for SAP developers, integration specialists, and data architects who need to understand and analyze SAP system metadata.

The metadata functions and their columns

FunctionOutput columns
sap_rfc_show_function([FUNCNAME, GROUPNAME])FUNCNAME, GROUPNAME, APPL, HOST, STEXT
sap_rfc_show_groups([GROUPNAME])name, text
sap_show_tables([TABLENAME, TEXT])table_name, text, class
sap_describe_fields(table)pos, is_key, field, text, sap_type, length, decimals, check_table, ref_table, ref_field, language
sap_rfc_describe_function(name)name, text, function_group, remote_callable, import, export, changing, tables, source

For sap_rfc_describe_function, the import/export/changing/tables columns are lists of structs, each struct having name, text, abap_type, duckdb_type, direction, length, decimals, default_value, optional.

Function Module Discovery

Listing Available Functions

-- List RFC-enabled function modules (filter server-side with FUNCNAME)
SELECT * FROM sap_rfc_show_function(FUNCNAME => 'BAPI_FLIGHT*');

-- Search by pattern in SQL
SELECT FUNCNAME, GROUPNAME, STEXT
FROM sap_rfc_show_function()
WHERE FUNCNAME LIKE '%BAPI%';

-- Analyze function distribution by name prefix
SELECT
SUBSTRING(FUNCNAME, 1, 3) AS function_prefix,
COUNT(*) AS function_count
FROM sap_rfc_show_function(FUNCNAME => 'BAPI*')
GROUP BY SUBSTRING(FUNCNAME, 1, 3)
ORDER BY function_count DESC;

Function Group Analysis

-- List all function groups
SELECT * FROM sap_rfc_show_groups();

-- Functions grouped by their function group (GROUPNAME is already on each row)
SELECT
GROUPNAME,
COUNT(*) AS function_count,
STRING_AGG(FUNCNAME, ', ') AS functions
FROM sap_rfc_show_function(FUNCNAME => 'BAPI_FLIGHT*')
GROUP BY GROUPNAME
ORDER BY function_count DESC;

Function Module Details

-- Get the full interface of a function module (one row)
SELECT name, function_group, remote_callable
FROM sap_rfc_describe_function('BAPI_FLIGHT_GETLIST');

-- Count parameters per direction using len() on the list columns
SELECT
name,
len(import) AS import_params,
len(export) AS export_params,
len(changing) AS changing_params,
len(tables) AS table_params
FROM sap_rfc_describe_function('BAPI_FLIGHT_GETLIST');

Listing individual parameters

The list columns are unnested to one row per parameter:

-- Import parameters of a function module
WITH f AS (SELECT * FROM sap_rfc_describe_function('BAPI_FLIGHT_GETLIST'))
SELECT p.name, p.abap_type, p.duckdb_type, p.length, p.decimals, p.optional
FROM f, UNNEST(f.import) AS t(p);

-- All parameters with their direction (import + export + tables)
WITH f AS (SELECT * FROM sap_rfc_describe_function('BAPI_FLIGHT_GETLIST'))
SELECT 'IMPORT' AS direction, p.name, p.abap_type, p.duckdb_type
FROM f, UNNEST(f.import) AS t(p)
UNION ALL
SELECT 'EXPORT', p.name, p.abap_type, p.duckdb_type
FROM f, UNNEST(f.export) AS t(p)
UNION ALL
SELECT 'TABLES', p.name, p.abap_type, p.duckdb_type
FROM f, UNNEST(f.tables) AS t(p);

Table Structure Analysis

Table Discovery

-- List SAP tables (filter server-side with TABLENAME)
SELECT * FROM sap_show_tables(TABLENAME => '*FLIGHT*');

-- Search for specific table patterns in SQL
SELECT table_name, text, class
FROM sap_show_tables()
WHERE table_name LIKE 'KNA%';

-- Analyze table naming patterns
SELECT
SUBSTRING(table_name, 1, 2) AS table_prefix,
COUNT(*) AS table_count
FROM sap_show_tables(TABLENAME => 'KN*')
GROUP BY SUBSTRING(table_name, 1, 2)
ORDER BY table_count DESC;

Table Field Analysis

-- Get table structure
SELECT * FROM sap_describe_fields('KNA1');

-- Analyze field characteristics
SELECT
field,
sap_type,
length,
decimals,
CASE
WHEN length > 100 THEN 'LONG_FIELD'
WHEN length > 50 THEN 'MEDIUM_FIELD'
ELSE 'SHORT_FIELD'
END AS field_size_category
FROM sap_describe_fields('KNA1')
ORDER BY length DESC;

Data Type Analysis

-- Analyze data type distribution
SELECT
sap_type,
COUNT(*) AS field_count,
AVG(length) AS avg_length,
MAX(length) AS max_length
FROM sap_describe_fields('KNA1')
GROUP BY sap_type
ORDER BY field_count DESC;

Cross-Reference Analysis

The check_table, ref_table, and ref_field columns of sap_describe_fields expose how a table's fields reference other tables (foreign-key check tables and currency/quantity reference fields):

-- Which tables does KNA1 reference via its fields?
SELECT field, check_table, ref_table, ref_field
FROM sap_describe_fields('KNA1')
WHERE check_table <> '' OR ref_table <> '';

-- Most-referenced check tables across a table's fields
SELECT
check_table AS referenced_table,
COUNT(*) AS reference_count,
STRING_AGG(field, ', ') AS referencing_fields
FROM sap_describe_fields('KNA1')
WHERE check_table <> ''
GROUP BY check_table
ORDER BY reference_count DESC;

Dynamic Integration Patterns

Function discovery for integration

First discover candidate functions, then describe a specific one to gauge its interface size. sap_rfc_describe_function takes a constant function name (one call per function):

-- 1. Find candidate BAPIs
SELECT FUNCNAME, STEXT FROM sap_rfc_show_function(FUNCNAME => 'BAPI_FLIGHT*');

-- 2. Classify a chosen function by its interface size
SELECT
name,
len(import) AS import_params,
len(export) AS export_params,
len(tables) AS table_params,
CASE
WHEN len(tables) > 0 THEN 'REQUIRES_TABLE_HANDLING'
WHEN len(import) > 10 THEN 'COMPLEX_INPUT'
ELSE 'SIMPLE_INTEGRATION'
END AS integration_complexity
FROM sap_rfc_describe_function('BAPI_FLIGHT_GETLIST');

Table schema generation

-- Generate a DuckDB CREATE TABLE skeleton from SAP table metadata
WITH cols AS (
SELECT
field,
CASE
WHEN sap_type IN ('CHAR', 'NUMC') THEN 'VARCHAR(' || length || ')'
WHEN sap_type = 'DEC' THEN 'DECIMAL(' || length || ',' || decimals || ')'
WHEN sap_type = 'INT4' THEN 'INTEGER'
WHEN sap_type = 'DATS' THEN 'DATE'
WHEN sap_type = 'TIMS' THEN 'TIME'
ELSE 'VARCHAR(' || length || ')'
END AS duckdb_type
FROM sap_describe_fields('KNA1')
)
SELECT
'CREATE TABLE KNA1 (' AS ddl_start,
STRING_AGG(' ' || field || ' ' || duckdb_type, ',' || chr(10)) AS columns,
');' AS ddl_end
FROM cols;

Performance Optimization

Metadata caching

-- Materialize metadata locally for repeated analysis
CREATE TABLE rfc_function_cache AS
SELECT * FROM sap_rfc_show_function(FUNCNAME => 'BAPI*');

CREATE TABLE rfc_table_cache AS
SELECT * FROM sap_show_tables(TABLENAME => 'KN*');

-- Query the cache instead of re-hitting SAP
SELECT * FROM rfc_function_cache WHERE FUNCNAME LIKE '%FLIGHT%';

Efficient metadata queries

-- Push the filter to SAP with the FUNCNAME parameter, not a SQL WHERE on everything
SELECT FUNCNAME, STEXT
FROM sap_rfc_show_function(FUNCNAME => 'BAPI_FLIGHT*')
LIMIT 100;

Troubleshooting

Function Not Found

-- Check whether a function exists / find similar ones
SELECT * FROM sap_rfc_show_function(FUNCNAME => 'BAPI_FLIGHT_GETLIST');
SELECT * FROM sap_rfc_show_function(FUNCNAME => '*FLIGHT*');

Table Not Found

SELECT * FROM sap_show_tables(TABLENAME => 'KNA1');
SELECT * FROM sap_show_tables(TABLENAME => 'KNA*');

Metadata Access Denied

-- Confirm connectivity and basic metadata access
PRAGMA sap_rfc_ping;
SELECT * FROM sap_rfc_describe_function('RFC_SYSTEM_INFO');

Debugging Tips

-- Enable ERPL tracing
SET erpl_trace_enabled = TRUE;
SET erpl_trace_level = 'DEBUG';

-- Test metadata functions
SELECT * FROM sap_rfc_show_function(FUNCNAME => 'BAPI*') LIMIT 5;
SELECT * FROM sap_show_tables(TABLENAME => 'KN*') LIMIT 5;
SELECT * FROM sap_rfc_describe_function('RFC_SYSTEM_INFO');

See also